Ordner kopeiren (C#)

Kieren

Mitglied
Hi
Ich möchte in C# einen Ordner mit Inhalt kopieren

Ich finde allerdings keinen passenden Befehl

C#:
Directory.Move(quelle, ziel)
^^verschiebt ja leider nur den Inhalt

Die Directory-Class kann sonst alles was ich brauch nur eben nicht kopieren
versteh des System auch nicht ganz wenn ich was verschiben kann kann ich es doch auch kopieren oder?
 
Hi.
Kieren hat gesagt.:
Die Directory-Class kann sonst alles was ich brauch nur eben nicht kopieren
versteh des System auch nicht ganz wenn ich was verschiben kann kann ich es doch auch kopieren oder?
Grundlegend unterscheided sich das Kopieren und Verschieben ziemlich. Ein Verschieben erfolgt lediglich durch eine Änderung im Dateisystem. Der Aufwand ist zudem ziemlich gering und die Aktion geht fast augenblicklich (in konstanter Zeit) vonstatten. Das Kopieren einer Datei (bzw. eines Ordners mit allen Dateien und Unterordnern) erfordert das eine komplette Kopie der Daten und der Verzeichnisstruktur in einem anderen Order erstellt wird. Deshalb ist es auch nicht möglich mit der Directory.Move Methode ein Verzeichnis bzw. eine Datei von einem Laufwerk auf ein anderes zu bewegen (es würde das Kopieren der Daten und der Struktur und letzendlich das Löschen des Originalordners erfordern).

Eine Datei kannst du mit der Copy Methode von System.IO.File kopieren. Willst du ein Verzeichnis komplett kopieren mußt du rekursiv durch das Verzeichnis durchgehen, die Verzeichnisstruktur im Zielverzeichnis anlegen und die Dateien einzeln dorthin kopieren. \edit: {Zum Schluss mußt du dann noch alle Dateien, Unterverzeichnisse und das Verzeichnis selbst löschen.} Also löschen mußt du natürlich nur beim Verschieben, beim Kopieren natürlich nicht.

Gruß
 
Zuletzt bearbeitet:
Christian Kusmanow hat gesagt.:
Warum nicht erst mal die Suchfunktion verwenden? :rolleyes:
[thread=191704]Folder Copy - Thread[/thread]

^^danke

Ich hatte zwar auch die Suchfunktion mit "copy" "folder" "direktory" "kopieren" "ordner"
benutzt aber hab den Thread nicht gefunden
oder übersehen bzw wegen falscher Programmiersprache ignoriert

Ich hab jetzt in google eine VB.NET version gefunden
und mach die grad zu C#

Aber die aus dem thread schau auch gut aus mal schauen was beser

Wenn meine c#-Funkion funktioniert lass ich euch auf jeden fall drann teilhaben
danke fürs raussuchen von dem Thread
 
Erstmal die orignal VB.NET Funktion http://www.bubble-media.com/cgi-bin/articles/archives/000026.html

Visual Basic:
' Recursively copy all files and subdirectories from the
' specified source to the specified destination.
Private Sub RecursiveCopyFiles( _
ByVal sourceDir As String, _
ByVal destDir As String, _
ByVal fRecursive As Boolean, ByVal overWrite As Boolean)

Dim i As Integer
Dim posSep As Integer
Dim sDir As String
Dim aDirs() As String
Dim sFile As String
Dim aFiles() As String

' Add trailing separators to the supplied paths if they don't exist.
If Not sourceDir.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) Then
sourceDir &= System.IO.Path.DirectorySeparatorChar
End If

If Not destDir.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) Then
destDir &= System.IO.Path.DirectorySeparatorChar
End If

' Recursive switch to continue drilling down into dir structure.
If fRecursive Then

' Get a list of directories from the current parent.
aDirs = System.IO.Directory.GetDirectories(sourceDir)

For i = 0 To aDirs.GetUpperBound(0)

' Get the position of the last separator in the current path.
posSep = aDirs(i).LastIndexOf(@"\")

' Get the path of the source directory.
sDir = aDirs(i).Substring((posSep + 1), aDirs(i).Length - (posSep + 1))

' Create the new directory in the destination directory.
System.IO.Directory.CreateDirectory(destDir + sDir)

' Since we are in recursive mode, copy the children also
RecursiveCopyFiles(aDirs(i), (destDir + sDir), fRecursive, overWrite)
Next

End If

' Get the files from the current parent.
aFiles = System.IO.Directory.GetFiles(sourceDir)


' Copy all files.
For i = 0 To aFiles.GetUpperBound(0)

' Get the position of the trailing separator.
posSep = aFiles(i).LastIndexOf(@"\")

' Get the full path of the source file.
sFile = aFiles(i).Substring((posSep + 1), aFiles(i).Length - (posSep + 1))
Try


' Copy the file.
System.IO.File.Copy(aFiles(i), destDir + sFile, False)
addToConsoleWindow("Copied " & sFile & " to " & destDir)
Catch ex As Exception
If overWrite = False Then
errorBoxShow(ex.Message)
addToConsoleWindow("Skipping..." & ex.Message)
Else
System.IO.File.Copy(aFiles(i), destDir + sFile, True)
addToConsoleWindow("Overwriting old " & sFile & " in " & destDir)
End If

End Try
Next i



End Sub


Und jetzt noch die auf C# umgebaute Funktion
C#:
    /*Recursively copy all files and subdirectories from the
    specified source to the specified destination.*/
    static void RecursiveCopyFiles(string sourceDir, string destDir, bool fRecursive, bool overWrite)
    {
        int i = 0;
        int posSep = 0;
        string sDir = null;
        string[] aDirs = null;
        string sFile = null;
        string[] aFiles = null;

        /*Add trailing separators to the supplied paths if they don't exist.*/
        if (!sourceDir.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()))
        {
            sourceDir += System.IO.Path.DirectorySeparatorChar;
        }

        if (!destDir.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()))
        {
            destDir += System.IO.Path.DirectorySeparatorChar;
        }

        /*Recursive switch to continue drilling down into dir structure.*/
        if (fRecursive) 
        {
            /*Get a list of directories from the current parent.*/
            aDirs = System.IO.Directory.GetDirectories(sourceDir);

            for (i = 0; i<=aDirs.GetUpperBound(0); i++)
            {
                /*Get the position of the last separator in the current path.*/
                posSep = aDirs[i].LastIndexOf(@"\"");

                /*Get the path of the source directory.*/
                sDir = aDirs[i].Substring((posSep + 1), aDirs[i].Length - (posSep + 1));

                /*Create the new directory in the destination directory.*/
                System.IO.Directory.CreateDirectory(destDir + sDir);
    
                /*Since we are in recursive mode, copy the children also*/
                RecursiveCopyFiles(aDirs[i], (destDir + sDir), fRecursive, overWrite);
            }
        }

        
        

        /*Get the files from the current parent.*/
        aFiles = System.IO.Directory.GetFiles(sourceDir);


        /*Copy all files.*/
        for (i = 0; i<= aFiles.GetUpperBound(0); i++)
        {
            /*Get the position of the trailing separator.*/
            posSep = aFiles[i].LastIndexOf(@"\"");
    
            /*Get the full path of the source file.*/
            sFile = aFiles[i].Substring((posSep + 1), aFiles[i].Length - (posSep + 1));
        
            try
            {
                /*Copy the file.*/
                System.IO.File.Copy(aFiles[i], destDir + sFile, false);
                Console.WriteLine("Copied " + sFile + " to " + destDir);
            }    
            catch (Exception ex)
            {   
                if (overWrite == false) 
                {
                    Console.WriteLine("Skipping..." + ex.Message);
                }   
                else
                {
                    System.IO.File.Copy(aFiles[i], destDir + sFile, true);
                    Console.WriteLine("Overwriting old " + sFile + " in " + destDir);
                
                }
            }

        }
    }
^^ACHTUNG: (@"\"") bitte durch (@"\") esrsetzen
Sonst zerstört es aber leider des Highlight


Ich schreib das hier auch noch in den andern Thread dann findet der nächste Suchende es eventuel auch *G*
 
Zuletzt bearbeitet:
Der Programmierer scheint allerdings anzunehmen, das des Trennzeichen für Pfade immer ein Backslash ist. Das funktioniert dann unter Unix spätestens nicht mehr oder wenn der Benutzer den System.IO.Path.AltDirectorySeperatorChar verwendet.

Es gibt extra Funktionen in System.IO.Path damit man nicht selbst mit irgendwelchen String-Funktionen Pfade auseinander klamüsern muß:

  • System.IO.Path.Combine
  • System.IO.Path.GetDirectoryName
  • System.IO.Path.GetFileName etc.
Gruß
 
Gut möglich aber des Ding wird so wie es aussieht genau 1mal laufen
und das unter windoof

von daher hab ich an solche Sachen nicht gedacht

aber trotzdem danke
 
Zurück