1) Считать дату изменения файла в переменную типа Date или String. 2) Изменить эту самую дату на какую-то другую. 3) Считать остальные аттрибуты файла в четыре буленовские переменные. 4) Соответственно, изменить и их тоже. 5) Ищется алгоритм сканирования древа файлов на диске, т.е. надо получить полные пути и имена всех файлов, содержащихся на носителе, алгоритм пока не найден, но я точно знаю, что есть несколько способов реализации, если у кого-то есть хоть один - очень буду благодарен. 6) Необходимо отслеживать, были ли нажатия каких-либо кнопок или движения мыши, пока прога работает в фоновом режиме. Собственно, пока все вопросы, если решение существует только в WinAPI (думаю, это больше всего относится к 6-му вопросу), то хотелось-бы увидеть полностью код.
Поясняю насчёт 6-го. Программа с невидимой формой, должна совершать некоторые действия при отсутствии пользовательской активности, как скрин сэйвер. Насчёт первых пяти - может, знаешь ссылки, где можно надыбать куски кода? Кстати, а 5-ый вопрос - почему это через API??? В VB есть всё для этого необходимое, я просто не могу допетрить как это всё организовать, там циклы должны быть вложенные, бесконечные, с выходом по условию если функция Dir будет возвращать пустое значение. Это пока единственное, к чему я пришёл
Например тут http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getfiletime.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/setfiletime.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/file_management_functions.asp
можно через filesystemobject, через Winapi (getfileAttributes и т.д дольше) подключаешь через references библиотеку microsoft scripting runtime-sccrun.dll есть на каждом компе и как то так Private Sub getlastdatemod(namefile as string) Dim objfso As FileSystemObject Dim objfile As file Dim s As String Set objfso = New FileSystemObject Set objfile = objfso.GetFile(namefile) s = objfile.DateLastModified MsgBox s End Sub 2. дату изменения файла нельзя просто так поменять, она на то и дата последнего изменения файла. изменишь файл поменяется дата 3, 4.то же самое что и выше и isereadony=(objfile.Attributes and readonly) ishidden=(objfile.Attributes and hidden) isSystem=(objfile.Attributes and system) iArchive=(objfile.Attributes and archive) изменения соответственно через логические операции 5. рекурсией. функция получает на входе каталог ищет все каталоги. все которые находит вызывает опять себя с именем найденного католога. каталоги кончились-работаем с файлами, что там нужно сделать. у filesystemobject есть свойство folders у которого свойство subfolders-это подкаталоги, в свою очередь являющиеся folders. и свойство files-это файлы в папке 6. нажатие кнопок и мыша ловится SetwindowsHookEх, в VB ето все долго делается. Надо ловить не нажатие кнопки, а событие бездействия ситсемы-не знаю как в VB, а в Delphi есть событие onIdle. на него и вешатся. а вообще такие штуки в виде сервисов делают.
Fox, да на Си. Тебе только функция нужна и её описание. Апи функции то наверно умеешь использовать? Раз пишешь на Васике. А лучше посмотри где-нибудь на специализированных сайтах. Их навалом в инете.
Спасибо, по первым четырём вроде бы всё понятно, попробую разобраться. По пятой общий смысл ясен, конечно, но это и раньше было понятно... Я пытаюсь с функцией Dir это реализовать, но пока что-то не получается, самое обидное, я помню, что где-то в инете натыкался прям на готовый код, но забыл, на каком сайте Щас вот ищу в конференциях, пока безрезультатно. Ещё забыл, один вопросик есть: 7) Как узнать размер файла? Видимо, тоже API, но, может, всё-таки, есть стандартные команды в самом VB.
Там вообще прикольно... Какой-то типок задавал вопросы по атрабутам файла и по сканированию файлового древа и ему так и не ответили. Видимо, не знает никто, что очень странно, вроде вопросы-то простые. Забавно само совпадение, причём, он эти темы совсем недавно разместил.
Ура! Кажися почти всё нашёл. Сегодня буду испытавать. А, может, ещё как размер файла узнать напишете?
Вот, пробуй: Размер файла можно определить тремя путями: 1. Если файл можно открыть функцией OPEN, то можно воспользоваться функцией LOF Dim FileFree As Integer Dim FileSize As Long FileFree = FreeFile Open "C:\boot.ini" For Input As FileFree FileSize = LOF(FileFree) Close FileFree 2. Используя функцию FileLen Dim lFileSize As Long FileSize = FileLen("C:\boot.ini") 3. Используя FileSystemObject Для использования этого примера установи ссылку на Microsoft Scripting Runtime через меню Project | References. Dim FSys As New FileSystemObject Private Sub Command1_Click() 'Не забудь установить ссылку на свой файл Set qn = FSys.GetFile("C:\boot.ini") MsgBox "Размер файла " & qn.Size / 1024 & " килобайт" End Sub
2Fox 5) В плане рекурсии не уверен, что это будет оптимально скоростным сканированием "древа". Могу предложить следующее: - создать динамический список, где элементы - это [список директорий + тек. индекс директории] на каждом уровне вложенности соответственно; - далее, берем первую директорию, заходим, сканируем на наличие папок и файлов, заполняем соответствующий элемент нашего динам. списка; - далее, повторяем пред. шаг до тех пор, пока не дойдем до дна, где уже не будет папок, одни файлы; - выходим наверх, увеличиваем индекс тек. директории на 1, переходим в след. папку из тек. списка директорий, при этом, каждый раз когда мы переходим на верхний уровень вложенности, не надо забывать удалять соответствующий элемент из динам. списка, т.е. тот уровень где все папки просканированы, нам уже не интересен; - т.о. мы выберемся на 0-ой уровень вложенности; Выход из внутреннего цикла, если все папки просканированы. Выход из внешнего цикла, если уровень вложенности=0. Главный минус, это конечно выделяемая память(хранить списки директорий на каждом уровне вложенности), многовато, однако без имени папки в нее не попадешь. Одним словом главным образом надо уделить внимание сокращению выделяемой памяти, путем более эффективного метода запоминания информации о каждом уровне вложенности. Либо запоминать только тек. индекс папки на каждом уровне вложенности, затем, при выходе наверх заново сканировать и переходить в директорию с нужным индексом.
Shild, спасибо за развёрнутый ответ. tgb, в принципе, твой способ мне понятен, непонятно только, почему ты считаешь, что он будет работать быстрее??? При сканировании дисков больше всего времени занимают именно обращения к носителю, хочешь сказать, у твоего способа таких обращений будет меньше?
ну как получилось с прогой поделись исходником !!! я иммею в виду подсчет места в директории с уважением !