RenameFile mit FindFirstChangeNotification: 0KB Problem

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

RenameFile mit FindFirstChangeNotification: 0KB Problem

Beitrag 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
Zuletzt geändert von sleepyhead am 25.11.2007 13:12, insgesamt 2-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: RenameFile mit FindFirstChangeNotification: 0KB Problem

Beitrag 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
a²+b²=mc²
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

Danke

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Danke

Beitrag 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
a²+b²=mc²
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

SetActiveWindow()

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: SetActiveWindow()

Beitrag 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)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
sleepyhead
Beiträge: 13
Registriert: 31.01.2006 01:03
Wohnort: Mettendorf TG (Schweiz)

SetForegroundWindow_(WindowID(0))

Beitrag von sleepyhead »

Danke AND51, habe den Code angepasst. :)

Gruss
Sleepyhead
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

np, gerne wieder! <)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten