2011-01-04 10 views
1

Angenommen, wir haben c:\\d1\\d2\\d3\\..., wo es viele Dateien und Verzeichnisse in d3 gibt.
Wir möchten alle Elemente in d3 zu c:\\d1\\new\\ verschieben.Ändern Sie die Dateiadresse

wie man es sauber und sicher macht?

c:\\d1\\new existiert!

+0

Möchten Sie wissen, wie Sie die Dateien physisch verschieben oder wie Sie alle Verweise auf den alten Pfad ändern können? –

Antwort

2

Wenn c:\d1\new noch nicht vorhanden ist, und Sie nicht möchten, danach einen leeren c:\d1\d2\d3 Ordner zu halten, können Sie die Directory.Move() Methode verwenden:

using System.IO; 

try { 
    Directory.Move(@"c:\d1\d2\d3", @"c:\d1\new"); 
} catch (UnauthorizedAccessException) { 
    // Permission denied, recover... 
} catch (IOException) { 
    // Other I/O error, recover... 
} 

Wenn c:\d1\new existiert, müssen Sie iterieren den Inhalt c:\d1\d2\d3 und bewegen ihre Dateien und Ordner eins nach dem anderen:

foreach (string item in Directory.GetFileSystemEntries(@"c:\d1\d2\d3")) { 
    string absoluteSource = Path.Combine(@"c:\d1\d2\d3", item); 
    string absoluteTarget = Path.Combine(@"c:\d1\new", item); 
    if (File.GetAttributes(absoluteSource) & FileAttributes.Directory != 0) { 
     Directory.Move(absoluteSource, absoluteTarget); 
    } else { 
     File.Move(absoluteSource, absoluteTarget); 
    } 
} 
+0

und wenn es existiert? –

+0

+1 für die einzige Anweisung, der ein Affe vielleicht sogar folgen könnte. –

+0

Wenn 'c: \ d1 \ new' existiert, müssen Sie den Inhalt von' c: \ d1 \ d2 \ d3' iterieren und seine Dateien und Ordner nacheinander mit derselben Funktion verschieben. –

2

Verwenden Directory.Move

Auch MSDN hat eine praktische Tabelle, welche Funktionen für Common I/O Tasks zu verwenden, die für Fragen wie diese eine gute Referenz.

0

Verwenden Sie Directory.Move.

Verschiebt eine Datei oder ein Verzeichnis und seinen Inhalt an einen neuen Speicherort.

1
try 
{ 
    System.IO.Directory.Move(@"c:\d1\d2\d3\", @"c:\d1\new\"); 
} 
catch(...) 
{ 
} 

Die Move-Methode kann eine der folgenden Ausnahmen auslösen, die abhängig von Ihrer Verwendung möglicherweise ausgelöst werden. Sie müssen also den Ausnahmebehandler so programmieren, dass er zu Ihrer Anwendung passt.

  • System.IO.IOExeption
  • System.UnauthorizedAccessException
  • System.ArgumentException
  • System.ArgumentNullException
  • System.IO.PathToLongException
  • System.IO.DirectoryNotFoundException

Als ein allgemeines Beispiel (Sie wahrscheinlich nicht wollen/müssen Meldungsfelder auf Fehler anzuzeigen):

try 
{ 
    System.IO.Directory.Move(@"c:\d1\d2\d3\", @"c:\d1\new\"); 
} 
catch (System.UnauthorizedAccessException) 
{ 
    MessageBox.Show("You do not have access to move this files/directories"); 
} 
catch(System.IO.DirectoryNotFoundException) 
{ 
    MessageBox.Show("The directory to move files/directories from was not found") 
} 
catch 
{ 
    MessageBox.Show("Something blew up!"); 
} 

Schließlich ist es erwähnenswert, dass der Anruf den aktuellen Thread blockiert zu bewegen, bis der Umzug abgeschlossen ist. Wenn Sie dies über eine Benutzeroberfläche tun, wird die Benutzeroberfläche blockiert, bis die Kopie fertiggestellt ist. Dies kann einige Zeit dauern, abhängig davon, wie viele Dateien/Verzeichnisse verschoben werden. Daher könnte es ratsam sein, dies in einem separaten Thread auszuführen und/oder eine Zyklusfortschrittsleiste anzuzeigen.

+0

Dies ist eine anständige Antwort. Ich bin mir nicht sicher, warum es einen Downvote erhalten hat ... – Kendrick

Verwandte Themen