2010-12-22 7 views
7

Wenn das Quellverzeichnis und das Zielverzeichnis, würde MoveFile tatsächlich eine Kopie der Quelldatei in die Zieldatei machen, was bedeutet, dass ich am Ende zwei Dateien sehen werde.Win32-API zum Umbenennen einer Datei in C

Ist das der beste Weg, dass Umbenennen erreicht werden kann?

+0

Umbenennungs in stdio.h? – vcsjones

+1

Was genau meinst du? 'MoveFileEx' mit' MOVEFILE_COPY_ALLOWED' gibt Ihnen keine zwei Dateien - es ruft CopyFile und dann DeleteFile auf, wenn sich die beiden Dateien auf unterschiedlichen Volumes befinden. – wj32

+0

Ich glaube, ich habe Instanzen gesehen, in denen MoveFile() CopyFile() + DeleteFile() ausführt, aber die Quelldatei ist immer noch von jemandem gesperrt, so dass der Status Delete Pending; Wenn es dann freigeschaltet wird, verschwindet es auf magische Weise. Oder vielleicht mache ich das aus; kann mich nicht erinnern. – Luke

Antwort

1

Wie sieht Ihr Code aus? Ich habe dies:

if(MoveFile(_T("c:\\hold\\source"),_T("c:\\hold\\dest"))) 
{ 
    printf("succeeded\n"); 
}else 
{ 
    printf("Error %d\n",GetLastError()); 
} 

und es hinterlässt die Quelle nicht zurück.

1

Sie könnten versuchen, die MoveFileEx() API ohne Angabe der MOVEFILE_COPY_ALLOWED zu verwenden, um zu sehen, ob dies das von Ihnen gesuchte Verhalten bietet.

+0

Wenn MOVEFILE_COPY_ALLOWED nicht angegeben wird, bedeutet dies, dass Bewegungen über mehrere Datenträger hinweg fehlschlagen. Das will das OP nicht. Das "Simulate by Copy/Delete" bezieht sich auf die Tatsache, dass Cross-Volume-Bewegungen nicht durch einfaches Umschreiben der Festplatten-Metadaten ausgeführt werden können, wie dies bei Moves mit gleichem Volumen geschieht. –

+0

@David: Ich dachte, das OP würde nach einem Umbenennungsvorgang fragen, der nur dann erfolgreich war, wenn man nur die Dateimetadaten anstelle einer Kopie/Löschen-Umbenennungssimulation ändern konnte (ich denke, die Frage ist mir etwas unklar). –

+0

Nun, um fair zu sein, die Frage ist extrem schlecht gestellt, so wie es so oft der Fall ist, kann man nur raten, was die Absicht war. Vielleicht ist deine Interpretation richtig! –

8

Die MoveFile Funktion ist in der Tat, was Sie wollen. Aus der Dokumentation:

Die Movefile Funktion (umbenennen) entweder eine Datei oder ein Verzeichnis (einschließlich der Kinder) entweder im gleichen Verzeichnis oder über Verzeichnisse bewegen.

Wenn die Quell- und Zielspeicherorte sich beide auf demselben Volume befinden, wird eine atomare Umbenennungsoperation ausgeführt. Wenn sie sich auf unterschiedlichen Volumes befinden, wird stattdessen ein Kopier-/Löschvorgang durchgeführt (dies ist das Beste, was Sie tun können).

+1

'MoveFileEx' wird standardmäßig nur verschoben, es wird ** nicht kopiert **, es sei denn, Sie übergeben das' MOVEFILE_COPY_ALLOWED'-Flag. – unixman83

4

Versuchen

#include <stdio.h> 

int Result = rename(oldname , newname); 

if (Result) 
    // "Error occurred."); 
else 
    // "File was successfully renamed!";