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.
 Wenn man Dateien in dieses Verzeichniss verschiebt, klappt es allerdings wunderbar.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

 , habe den Code basierend auf deiner Idee abgeändert und noch den Fehler behoben, dass er Dateien, die während dem Verschieben in den Ordner kopiert werden nicht verschoben werden behoben. Und noch mit StickyWindow und SetWindowState dafür gesorgt, das beim Wiederherstellen aus der Tray das Fenster auch sichtbar wird.
 , habe den Code basierend auf deiner Idee abgeändert und noch den Fehler behoben, dass er Dateien, die während dem Verschieben in den Ordner kopiert werden nicht verschoben werden behoben. Und noch mit StickyWindow und SetWindowState dafür gesorgt, das beim Wiederherstellen aus der Tray das Fenster auch sichtbar wird.
 
 
