2009-10-26 10 views
8

Ich versuche, ein Verzeichnis in C# in einen Namen umzubenennen, der nur bei unterschiedlichem Groß-/Kleinschreibung identisch ist.Umbenennen von Verzeichnis mit dem gleichen Namen anderen Fall

Zum Beispiel: f: \ test zu f: \ TEST

ich diesen Code versucht haben:

var directory = new DirectoryInfo("f:\\test"); 
directory.MoveTo("f:\\TEST"); 

und ich bekomme eine IOException - Quell- und Zielpfad unterschiedlich sein müssen. Ich habe auch Directory.Move() mit dem gleichen Ergebnis versucht.

Wie wird das gemacht? Muss ich ein separates temporäres Verzeichnis erstellen, die enthaltenen Dateien aus dem ursprünglichen Verzeichnis in das temporäre Verzeichnis verschieben und dann das Original löschen und das temporäre Verzeichnis umbenennen?

Antwort

11

Nun, Sie müssen kein separates Verzeichnis erstellen und alles verschieben. benennen Sie den Ordner, in etwas anderes und dann zurück zu dem gewünschten Namen:

var dir = new DirectoryInfo(@"F:\test"); 
dir.MoveTo(@"F:\test2"); 
dir.MoveTo(@"F:\TEST"); 
+0

danke, das macht viel mehr Sinn als die Art, wie ich es beschrieben habe. – scott

+2

Eigentlich braucht 'MoveFileEx' dieses Flag nicht, um es zu tun; Sie können sogar 'MoveFile' verwenden, und es funktioniert gut. Es ist die BCL, die das Umbenennen verhindert, nicht Win32. –

-1

Die Antwort ist ja in diesem Fall - das Dateisystem selbst sieht die beiden nicht als unterschiedlich, also müssen Sie löschen und die hinzufügen als den neuen Namen (oder verschieben/löschen/verschieben, wie Sie vorgeschlagen)

+5

Das Dateisystem selbst tut es. Der Windows-API-Wrapper umschließt die Groß- und Kleinschreibung. – Joey

1

Warum nicht das Verzeichnis temp umbenennen und dann erneut in TEST umbenennen?

0

Auch wenn die .NET-Methode DirectoryInfo.MoveTo eine Ausnahme auslöst, wenn der Name der gleiche ist, können Sie die Windows-API-MoveFile Funktion wie folgt aufrufen das Gehäuse des Verzeichnisnamens zu setzen:

bool success = MoveFile(dirInfo.FullName, dirInfo.FullName); 

Mit dieser extern-Deklaration:

[DllImport("kernel32", SetLastError = true)] 
private static extern bool MoveFile(string lpExistingFileName, string lpNewFileName); 

Es funktioniert gut für mich, wenn th Der Name unterscheidet sich nur im Fall. Ich habe nicht versucht, es so zu nennen, wenn der Name bereits genau so ist wie angegeben.

Dies hat den Vorteil, dass das Verzeichnis niemals unter seinem ursprünglichen Namen verschwindet.

Es hat jedoch den Nachteil, dass es nur unter Windows funktioniert.

Verwandte Themen