Ich habe ein kleines Programm geschrieben, um Dateien, welche in einem Verzeichnis landen automatisch zu verschieben. Um die Änderungen abzufragen benutze ich den API-Befehl FindFirstChangeNotification welcher mir leider auch ein Event gibt, wenn ich eine Datei anfange in das überwachte Verzeichnis zu kopieren. Dadurch versucht mein Programm eine 0 Byte grosse Datei zu verschieben, welche noch nicht fertig kopiert wurde.

Weiss da jemand eine Lösung? Hier ist der bisherige Code:
Code: Alles auswählen
DataSection
TrayIco:
IncludeBinary "icons\tray.ico"
MoveIco:
IncludeBinary "icons\move.ico"
EndDataSection
Global hchangeobject.l, FromDir.s, ToDir.s, MoveNow.l
Structure Look
Directory.s
Milliseconds.l
EndStructure
Procedure FolderSpy(*SLook.Look)
Protected exit.l
While exit = 0
hchangeobject=FindFirstChangeNotification_(*SLook\Directory,0,1)
If WaitForSingleObject_(hchangeobject,*SLook\milliseconds)= 0
x = 1
While x > 0
x = 0
If ExamineDirectory(0, FromDir, "*.*")
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
x + 1
MoveNow = 1
If IsSysTrayIcon(0)
ChangeSysTrayIcon(0, CatchImage(1, ?MoveIco))
SysTrayIconToolTip(0, "AutoMover: Copy file")
EndIf
If GetFileAttributes(ToDir + DirectoryEntryName(0)) = -1
NewFile$ = DirectoryEntryName(0)
Else
NewName$ = Left(DirectoryEntryName(0), Len(DirectoryEntryName(0)) - (Len(GetExtensionPart(DirectoryEntryName(0))) + 1))
ExtPart$ = Right(DirectoryEntryName(0), Len(GetExtensionPart(DirectoryEntryName(0))) + 1)
i = 1
While GetFileAttributes(ToDir + NewName$ + Str(i) + ExtPart$) <> -1
i + 1
Wend
NewFile$ = NewName$ + Str(i) + ExtPart$
EndIf
i = 0
While RenameFile(FromDir + DirectoryEntryName(0), FromDir + DirectoryEntryName(0)) = 0 And i < 360
If i = 0
AddGadgetItem(0, -1, FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", Date()) + " Move " + DirectoryEntryName(0) + " delayed")
SetGadgetState(0, CountGadgetItems(0) - 1)
EndIf
Delay(1000)
i + 1
Wend
If i = 360
AddGadgetItem(0, -1, FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", Date()) + " Can not move " + DirectoryEntryName(0))
SetGadgetState(0, CountGadgetItems(0) - 1)
Else
AddGadgetItem(0, -1, FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", Date()) + " Move " + DirectoryEntryName(0) + " (" + Str(FileSize(FromDir + DirectoryEntryName(0))) + " Bytes)")
SetGadgetState(0, CountGadgetItems(0) - 1)
RenameFile(FromDir + DirectoryEntryName(0), ToDir + NewFile$)
EndIf
If IsSysTrayIcon(0)
ChangeSysTrayIcon(0, CatchImage(1, ?TrayIco))
SysTrayIconToolTip(0, "AutoMover: Ready")
EndIf
MoveNow = 0
EndIf
Wend
FinishDirectory(0)
EndIf
Wend
EndIf
FindNextChangeNotification_(hchangeobject)
Wend
EndProcedure
If OpenPreferences("automover.conf")
PreferenceGroup("Global")
FromDir = ReadPreferenceString("FromDir", "")
ToDir = ReadPreferenceString("ToDir", "")
ClosePreferences()
EndIf
If FromDir = "" Or ToDir = ""
FromDir = PathRequester("Please select the source directory", "")
ToDir = PathRequester("Please select the destination directory", "")
If FromDir = "" Or ToDir = ""
End
EndIf
If CreatePreferences("automover.conf")
PreferenceGroup("Global")
WritePreferenceString("FromDir", FromDir)
WritePreferenceString("ToDir", ToDir)
ClosePreferences()
EndIf
EndIf
If OpenWindow(0, 100, 200, 250, 200, "AutoMover", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
ListViewGadget(0, 1, 1, 248, 198)
ExamineDirectory(0, FromDir, "")
ExamineDirectory(1, ToDir, "")
If IsDirectory(0) = 0 Or IsDirectory(1) = 0
MessageRequester("Error", "Source or destination directory does not exist!", #MB_ICONERROR | #MB_SYSTEMMODAL)
End
EndIf
FinishDirectory(0)
FinishDirectory(1)
FLook.Look
FLook\Directory = FromDir
FLook\Milliseconds = 500
MyThread = CreateThread(@Folderspy(),@Flook)
Repeat
EventID.l = WaitWindowEvent()
Select EventID
Case #PB_Event_CloseWindow
FindCloseChangeNotification_(hchangeobject)
Quit = 1
Case #PB_Event_SizeWindow
If GetWindowState(0) <> #PB_Window_Minimize
ResizeGadget(0, #PB_Ignore, #PB_Ignore, WindowWidth(0) - 2, WindowHeight(0) - 2)
EndIf
Case 49467
If GetWindowState(0) = #PB_Window_Minimize
HideWindow(0, 1)
If MoveNow = 1
AddSysTrayIcon(0, WindowID(0), CatchImage(0, ?MoveIco))
SysTrayIconToolTip(0, "AutoMover: Move file")
Else
AddSysTrayIcon(0, WindowID(0), CatchImage(0, ?TrayIco))
SysTrayIconToolTip(0, "AutoMover: Ready")
EndIf
EndIf
Case #PB_Event_SysTray
If EventType() = #PB_EventType_LeftClick
RemoveSysTrayIcon(0)
HideWindow(0, 0)
SetWindowState(0, #PB_Window_Normal)
SetForegroundWindow_(WindowID(0))
EndIf
EndSelect
Until Quit = 1
EndIf
End