RenameFile mit FindFirstChangeNotification: 0KB Problem
Verfasst: 24.11.2007 22:13
Hallo zusammen,
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.
Wenn man Dateien in dieses Verzeichniss verschiebt, klappt es allerdings wunderbar.
Weiss da jemand eine Lösung? Hier ist der bisherige Code:
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