Как можно сделать, чтобы если например в папке появляется новый файл, программа выдает сообщение с определенным текстом и с сылкой на файл.
Сообщение о добавлении файла
Страница: 1
Сообщений 1 страница 3 из 3
Поделиться225.05.2011 12:17:08
Может не самый оптимальный вариант кода (мастера предложат лучше):
При первом старте сканируем нужную директорию, далее по таймеру или при клике на кнопку снова сканируем и смотрим все совпадения...
Запусти, а потом создай на диске С новый файл и нажми кнопку....
Код:
Enumeration
#Window_0
#But
EndEnumeration
Global put.s="C:\"
Structure Spisok
Name.s
EndStructure
Global NewList MySpisok.Spisok() ; Динамически связанный список
Procedure Direct(ifr)
If ExamineDirectory(0, GetPathPart(put.s), "*.*")
Repeat
FileType = NextDirectoryEntry(0)
If FileType
FileName.s = DirectoryEntryName(0)
If FileName.s <> "." And FileName.s <> ".."
If ifr=0
AddElement(MySpisok())
MySpisok()\Name=FileName
ElseIf ifr=1
ForEach MySpisok()
If FileName=MySpisok()\Name
ff=1
EndIf
Next
If ff=0
MessageRequester("Новый файл",put.s+FileName)
EndIf
ff=0
EndIf
EndIf
EndIf
Until FileType = 0
EndIf
EndProcedure
OpenWindow(#Window_0,0,0,380,200,"Окно",#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
ButtonGadget(#But,10,10,70,20,"Пуск")
Direct(0)
HideWindow(#Window_0, 0)
Repeat
Event = WaitWindowEvent()
Window = EventWindow()
Gadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #But
Direct(1)
;SetTimer_(WindowID(#Window_0),Event,10000,@Direct()) ;опрос по таймеру
EndSelect
EndSelect
If Event = #PB_Event_CloseWindow
Break
EndIfОтредактировано mirashic (25.05.2011 12:24:20)
Поделиться325.05.2011 14:50:35
Есть специальная API функция в Винде для этого - ReadDirectoryChangesW
Пример использования:
Код:
;
; Monitor Directory Changes
;
; Notify filter values
#FILE_NOTIFY_CHANGE_FILE_NAME = 1
#FILE_NOTIFY_CHANGE_DIR_NAME = 2
#FILE_NOTIFY_CHANGE_ATTRIBUTES = 4
#FILE_NOTIFY_CHANGE_SIZE = 8
#FILE_NOTIFY_CHANGE_LAST_WRITE = $10
#FILE_NOTIFY_CHANGE_LAST_ACCESS = $20
#FILE_NOTIFY_CHANGE_CREATION = $40
#FILE_NOTIFY_CHANGE_SECURITY = $100
#FILE_NOTIFY_CHANGE_ALL = $17F
;
#FILE_SHARE_DELETE = 4
; Notify events
Enumeration
#FILE_ACTION_ADDED = 1
#FILE_ACTION_REMOVED
#FILE_ACTION_MODIFIED
#FILE_ACTION_RENAMED_OLD_NAME
#FILE_ACTION_RENAMED_NEW_NAME
EndEnumeration
; Notify info
Structure FILE_NOTIFY_INFORMATION
NextEntryOffset.l
Action.l
FileNameLength.l
Filename.s{255}
EndStructure
Import "kernel32.lib"
ReadDirectoryChangesW(a, b, c, d, e, f, g, h)
EndImport
Procedure WatchDirOrFile(DirectoryName.s, NotifyFilter.l = #FILE_NOTIFY_CHANGE_ALL)
Protected buffer.FILE_NOTIFY_INFORMATION, ovlp.OVERLAPPED
Protected FileAction_Filename.s
;
hDir = CreateFile_(DirectoryName, #FILE_LIST_DIRECTORY, #FILE_SHARE_READ | #FILE_SHARE_WRITE | #FILE_SHARE_DELETE, #Null, #OPEN_EXISTING, #FILE_FLAG_BACKUP_SEMANTICS, #Null)
;
While ReadDirectoryChangesW(hDir, @buffer, SizeOf(FILE_NOTIFY_INFORMATION), #True, NotifyFilter, bytesRead, ovlp, 0)
;
FileAction_Filename = PeekS(@buffer\Filename, -1, #PB_Unicode)
Select buffer\Action
Case #FILE_ACTION_ADDED
Debug FileAction_Filename + " was added"
Case #FILE_ACTION_REMOVED
Debug FileAction_Filename + " was removed"
Case #FILE_ACTION_MODIFIED
Debug FileAction_Filename + " was modified"
Case #FILE_ACTION_RENAMED_OLD_NAME
Debug FileAction_Filename + " was renamed (old name)"
Case #FILE_ACTION_RENAMED_NEW_NAME
Debug FileAction_Filename + " was renamed (new name)"
EndSelect
;
Wend
;
EndProcedure
;
; E X A M P L E
;
Debug GetCurrentDirectory()
WatchDirOrFile(GetCurrentDirectory())Страница: 1