Seite 1 von 1

RenameFile mit FindFirstChangeNotification: 0KB Problem

Verfasst: 24.11.2007 22:13
von sleepyhead
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:

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

Re: RenameFile mit FindFirstChangeNotification: 0KB Problem

Verfasst: 24.11.2007 23:01
von Kiffi
Hi sleepyhead,

versuch mal folgendes:

Code: Alles auswählen

[...]
If RenameFile(FromDir + DirectoryEntryName(0),FromDir + DirectoryEntryName(0))
  RenameFile(FromDir + DirectoryEntryName(0), ToDir + NewFile$) 
EndIf
[...]
Grüße ... Kiffi

Danke

Verfasst: 25.11.2007 02:19
von sleepyhead
Danke Kiffi :allright: , 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.

Gruss
Sleepyhead

Re: Danke

Verfasst: 25.11.2007 02:28
von Kiffi
sleepyhead hat geschrieben:Und noch mit StickyWindow und SetWindowState dafür gesorgt, das beim Wiederherstellen aus der Tray das Fenster auch sichtbar wird.
anstelle von StickyWindow() kannst Du SetActiveWindow() nehmen :-)

Grüße ... Kiffi

SetActiveWindow()

Verfasst: 25.11.2007 11:45
von sleepyhead
Das habe ich versucht, allerdings kommt das Fenster mit diesem Befehl bei mir nicht in den Vordergrund. In der Hilfedatei steht auch: "Der Befehl wird nur den Fokus innerhalb Ihres Programms verändern". Und er sollte das Fenster ja in den Vordergrund bringen, egal wieviele andere noch davor sind, daher habe ich den Umweg über StickyWindow() genommen. So kommt das Fenster einfach immer in den Vordergrund, auch wenn der Befehl eigentlich nicht ganz für das gedacht ist... <)

Gruss
Sleepyhead

Re: SetActiveWindow()

Verfasst: 25.11.2007 12:58
von AND51
sleepyhead hat geschrieben:In der Hilfedatei steht auch: "Der Befehl wird nur den Fokus innerhalb Ihres Programms verändern". Und er sollte das Fenster ja in den Vordergrund bringen, egal wieviele andere noch davor sind
Joar, dann löschste dein StickyWindow() mal und benutzt dafür SetForegroundWindow_(). :allright:

So schön kann das Leben sein. 8)

SetForegroundWindow_(WindowID(0))

Verfasst: 25.11.2007 13:16
von sleepyhead
Danke AND51, habe den Code angepasst. :)

Gruss
Sleepyhead

Verfasst: 25.11.2007 14:07
von AND51
np, gerne wieder! <)