Warten beim Umbenennen einer Datei...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Warten beim Umbenennen einer Datei...

Beitrag von Ghosty1967 »

Hallo zusammen...
ich brauche wieder einmal eure Hilfe. Ich habe den Inhalt eines Verzeichnisses in eine strukturierten Liste eingelesen und
die gefundenen Dateien in ein ListIconGadget() eingetragen.

Was ich gerne möchte ist...
In einer "ForEach" Schleife benenne ich die gefundenen Dateien mittels RenameFile() um. Nach dem Umbenennen soll nun
der entsprechende Eintrag im ListIconGadget() als erledigt markiert werden.
Soweit klappt das auch...
..aber was wirklich passiert ist...
die Markierung im ListIconGadget() läuft sozusagen vor. D.h., das Programm wartet gar nicht erst, bis die Dateioperation abgeschlossen
ist sondern schickt anscheinend einfach alle Umbenennbefehle in einen "Befehlsstack" an das Betriebssystem und das arbeitet diese im
Hintergrund ab.
Ich möchte aber gerne, das diese Markierung erst gesetzt wird, wenn die Operation für die jeweilige Datei wirklich ausgeführt wurde und
die entsprechende Datei wirklich umbenannt oder auch verschoben wurde.

Hat da jemand eine Lösung für mich?
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Warten beim Umbenennen einer Datei...

Beitrag von RSBasic »

Ich weiß leider nicht, was dein Programm genau macht bzw. wie es aufgebaut ist, aber wenn du ein Event für eine Dateiumbenennung brauchst: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Warten beim Umbenennen einer Datei...

Beitrag von matbal »

Ghosty1967 hat geschrieben:D.h., das Programm wartet gar nicht erst, bis die Dateioperation abgeschlossen
ist sondern schickt anscheinend einfach alle Umbenennbefehle in einen "Befehlsstack" an das Betriebssystem und das arbeitet diese im
Hintergrund ab.
Ich kann das bei mir nicht feststellen. Unmittelbar nach dem Umbenennen kann ich auf die umbenannte Datei zugreifen.

So habe ich mit 10000 generierten Dateien getestet: Dateien in einer Liste eingelesen. In einer foreach-Schleife erst umbenannt und dann noch kurz zum Lesen geöffnet. Ohne Fehler.

Code: Alles auswählen

Path$ = "d:\test1\"

Structure s_File
   old$
   new$
EndStructure


Global NewList File.s_File()

If ExamineDirectory(0, Path$, "*.txt")
   While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
         name$ = DirectoryEntryName(0)
         AddElement(File())
         File()\old$ = Path$ + name$
         File()\new$ = Path$ + "0" + name$
      EndIf
   Wend
   FinishDirectory(0)
EndIf

ForEach File()
   With File()
      ; Debug \old$
      If RenameFile(\old$, \new$) = 0
         Debug \old$ + " Fehler beim Umbenennen"
      Else
         If ReadFile(0, \new$) 
            CloseFile(0)
         Else
            Debug \old$ + " Fehler beim öffnen"
         EndIf
         
      EndIf
      
   EndWith
   
Next
Zuletzt geändert von matbal am 07.11.2016 12:56, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Warten beim Umbenennen einer Datei...

Beitrag von Kiffi »

vielleicht sowas in der Art:

Code: Alles auswählen

If RenameFile(OldFilename$, NewFilename$)
	While FileSize(NewFilename$) <> -1
		Delay(WhatEver)
	Wend
EndIf
Grüße ... Peter
a²+b²=mc²
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Warten beim Umbenennen einer Datei...

Beitrag von DarkSoul »

If RenameFile(OldFilename$, NewFilename$)
While FileSize(NewFilename$) <> -1
Delay(WhatEver)
Wend
EndIf
Viel Spaß beim Warten.... :o
die Markierung im ListIconGadget() läuft sozusagen vor. D.h., das Programm wartet gar nicht erst, bis die Dateioperation abgeschlossen
ist sondern schickt anscheinend einfach alle Umbenennbefehle in einen "Befehlsstack" an das Betriebssystem und das arbeitet diese im
Hintergrund ab.
Ich möchte aber gerne, das diese Markierung erst gesetzt wird, wenn die Operation für die jeweilige Datei wirklich ausgeführt wurde und
die entsprechende Datei wirklich umbenannt oder auch verschoben wurde.
Da würde ich mir keine Sorgen machen!

RenameFile() hat doch einen Rückgabewert, ob es geklappt hat. Also wird auch auf das Ergebnis gewartet. Wenn der positiv ist, wurde auch umbenannt und du kannst zur nächsten Dateiumbenennung übergehen.

Was du wahrscheinlich gesehen hast:
Dein Programm ist längst durchgelaufen und erst nach einiger Zeit siehst du das Ergebnis im Windows-Explorer.

Das liegt daran, dass Dateien umbenennen sehr sehr schnell geht und es noch einige Zeit dauert, bis Windows die Änderungen bemerkt und die Dateiliste im Windows-Explorer entsprechend aktualisiert.

Völlig alltäglich und bei vielen Dateioperationen so zu beobachten. Zwischen Datei mit beliebigem Programm speichern und Datei ist zu sehen, vergeht auch immer etwas Zeit. (Vereinfacht gesagt: Er guckt nur alle paar Sekunden, ob was verändert wurde und aktualisiert ggf. daraufhin).

In Wirklichkeit sind deine Dateien in dieser Zeitspanne dazwischen auf dem Datenträger längst umbenannt. :mrgreen:

Die Anzeige im Windows-Explorer läuft zeitlich der Realität nur ein wenig nach. :)
Bild
Antworten