Laden...

Rekrusives Ordner kopieren?

Erstellt von CinemaStrange vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.682 Views
C
CinemaStrange Themenstarter:in
24 Beiträge seit 2005
vor 19 Jahren
Rekrusives Ordner kopieren?

Hiho,

Auf die Gefahr hin das ich die Frage wiederholt stelle....Finde die net so wirklich....

Ähm, bin erstma Newbe was C# anbelangt. Kleine Vorwahnung 😁

Ich möchte einen Ordner von einem Pc auf einen Server kopieren.
Packen lohnt sich net so wirklich sind keine großen Ordner die kopiert werden sollen.
Nun aber zu meinem Problem:
Ich hab absolut keine Ahnung wie ich das machen soll. 8o
Weiß nur, mit dem Directory.Move kann ich nichts anfangen weil die Ordner auf dem PC erhalten bleiben sollen. 🙁
Habt Ihr da ein Tutorial bzw ein Codeschnipsel , wenn möglich mit Erklärungen was wo passiert, wo ich spicken kann?

Wäre supper weil brauch das wirklich dringend. Muss damit spätestens in einer Woche fertig sein..... X(

darkgreetz

Cine

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo CinemaStrange,

bist du dir sicher, dass du das extra programmieren musst. Immerhin gibt es ja 'xcopy /s <quelle> <ziel>'.

Wenn du es wirklich in C# programmieren willst, musst du das vermutlich komplett ausprogrammieren. Mit Directory.GetFiles die Dateinamen holen, den Ziel-Pfad berechen, mit File.Copy die Dateien einzeln kopieren und mit Directory.GetDirectories rekursiv absteigen.

HTH

herbivore

C
CinemaStrange Themenstarter:in
24 Beiträge seit 2005
vor 19 Jahren

Wollen tu ich es nicht. Ich muss. Cheffe will es als klickibunti haben. 😁

Hast du vielleicht ein paar Links oder sowas mit einem Beispiel wo man des Schritt per Schritt durchgeht?

darkgreetz

Cine

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo CinemaStrange,

nicht schlagen, wenn ich einen Link zu VB-Code poste. Aber es sieht so aus, als wäre es genau, was du brauchst:

Recursive File copy in VB.NET

HTH

herbivore

PS: In meiner Auflistung oben, habe ich vergessen, dass man die Zielverzeichnisse noch selbst anlegen muss (Directory.CreateDirectory).

C
CinemaStrange Themenstarter:in
24 Beiträge seit 2005
vor 19 Jahren

Warum sollt ich dich schlagen?

Zum Lernen ist das doch egal in welcher Sprache.
Hauptsache ich kapier, wie sowas geht. Das Umsetzten dürfte dann eigetlich net so das Schwirige sein, hoffe ich zu mindest 😄.

Und welche Sprache ist in meinen Augen eh Geschmackssache. Könnte man lange drüber diskutieren.

Thx aber erstmal für die Hilfe.
Hoffe, wenn ich auf Probleme stoße, dass ich mich dann wieder bei dir melden kann.

Werd ma gucken ob ich damit was anfangen kann 😉

Melde mich auch wenn ich es geschafft habe.

darkgreetz

Cine

B
189 Beiträge seit 2004
vor 19 Jahren

Aber bitte Pfade nicht wie in diesem VB.NET-Beispiel mit Stringfunktionen zusammenbasteln, sondern das explizit hierfür gedachte Path.Combine() einsetzen. Wenn ich diese ganzen LastIndexOf() und und Substring() sehe, kriege ich 'ne Krise...

C
CinemaStrange Themenstarter:in
24 Beiträge seit 2005
vor 19 Jahren

Öhm, auch wenn ich nerve, aber hasst du denn da mal ein Codeschnippsel ohne diese Zeugs? und mit den Funktionen die du meinst?

Währe hilfreich für mich....

darkgreetz

Cine

B
189 Beiträge seit 2004
vor 19 Jahren

Einfaches Beispiel: Du hast den absoluten Pfad eines Verzeichnisses und den Namen eines Unterverzeichnisses. Diese möchtest du nun zum vollständigen Pfad zusammensetzen. Geht ganz einfach:

string basePath = @"D:/Daten/Downloads";
string subDir   = "Videos";
string fullPath = Path.Combine(basePath, subDir);

// Ausgabe: D:/Daten/Downloads/Videos
Console.WriteLine("Vollstaendiger Pfad: {0}", fullPath);

PS: Die Boardsoftware schnippelt anscheinend Backslashes heraus! 😦 Daher habe ich oben als Pfadtrennzeichen das normale "/" verwendet.

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo bitstream,

Die Boardsoftware schnippelt anscheinend Backslashes heraus!

das ist mir auch schon störend aufgefallen, aber zumindest kann man das Problem durch Verdoppelung der Backslashes umgehen.

herbivore

C
CinemaStrange Themenstarter:in
24 Beiträge seit 2005
vor 19 Jahren

Hm, thx.

Also bin jetzt soweit, dass ich die Ordner der ersten Ebene erstellen kann aber noch ohne die Inhalte.

Falls es euch interessiert habe das so gelöst:


string [] dirs = Directory.GetDirectories(quelle);
Directory.CreateDirectory(ziel);
foreach (string dir in dirs)
{
	int y = dir.LastIndexOf("\\");
	string tmp = dir.Substring(y+1);
	string zw = ziel + "\\" + tmp;
	Directory.CreateDirectory(zw);
}

Glaub des ist der Lösungsansatz d en du net sehen wolltes oder?

Wie gesagt ausgereift ist des noch lang net aber so hab ich wenigstens was ind er Hand was ich Cheffe abgeben kann.

darkgreetz

Cine

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo CinemaStrange,

ich denke was bitstream meinte ist folgendes:


string zw = Path.Combine(ziel, tmp);

statt


string zw = ziel + "\\" + tmp;

HTH

herbivore

C
CinemaStrange Themenstarter:in
24 Beiträge seit 2005
vor 19 Jahren

Hab ich grade probiert Funktioniert auch.

Sieht schon mal eleganter aus 😁

Hab jetzt bloß das Problem das ich wie gesagt die Ordner der ersten Ebene schon rüber bekomme nur jetzt hänge ich an den Files die wollen net so wie ich das will....

Das betraf jetzt aber nur die eine Zeile oder? mit dem Combine oder kann man sich damit noch mehr Summs eresparen?

darkgreetz

Cine

B
189 Beiträge seit 2004
vor 19 Jahren

@herbivore: Jupp, genau das meinte ich.

M
456 Beiträge seit 2004
vor 19 Jahren

Hab mal ein kleines Prog geschrieben, dass die Zeilen von *.cs Quellcodedateien zählt:
Es sollte ganz gut demonstrieren, wie man Verzeichnisste rekursiv durchsucht.
Hier der Auszug:


		private void bCount_Click(object sender, System.EventArgs e)
		{
			int lines = 0;
			int files = 0;

			CountLOC( new DirectoryInfo(tbFolder.Text), ref lines, ref files );

			tbLOC.Text = lines.ToString();
			tbFiles.Text = files.ToString();
		}

		private void bBrowse_Click(object sender, System.EventArgs e)
		{
			if( folderBrowserDialog.ShowDialog() == DialogResult.OK )
			{
				tbFolder.Text = folderBrowserDialog.SelectedPath;
			}
		}

		private void CountLOC( DirectoryInfo di, ref int lines, ref int files )
		{
			FileInfo[] fs = di.GetFiles( "*.cs" );
			foreach( FileInfo f in fs )
			{
				CountLOC( f, ref lines );
				files++;
			}
	
			DirectoryInfo[] dirs = di.GetDirectories();
			foreach( DirectoryInfo d in dirs )
			{
				CountLOC( d, ref lines, ref files );
			}
		}

		private void CountLOC( FileInfo fi, ref int lines )
		{
			StreamReader sr = fi.OpenText();
			string l;

			while (sr.Peek() >= 0)
			{
				sr.ReadLine();
				lines++;
			}

			sr.Close();
		} 

Du müsstest dann nur noch die CountLOC Methode, welche die Zeilen zählt, durch eine Kopierrountine ersetzen.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

M
115 Beiträge seit 2003
vor 19 Jahren

Ich hab so was ähnliches gemacht: Backup auf Server.
Weil ich eine Progressbar wollte, hab ich die Shell-Funktion SHFileOperation(shell32) verwendet.
Damit kann man sich auch die rekursive Verzeichnissuche sparen.

www.pinvoke.net

Servas,
Meli

Gernot Melichar

M
456 Beiträge seit 2004
vor 19 Jahren

SHFileOperation per PInvoke könnte man nehmen, dafür verspielt man sich aber jede Form von Portabilität.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

C
CinemaStrange Themenstarter:in
24 Beiträge seit 2005
vor 19 Jahren

Für alle die es interessiert hab ich hie mal meine Lösung ......


public static void filework(string source, string destination)
		{
			// Ordner durchgehen
			foreach (string folder in Directory.GetDirectories(source))
			{
				// Ordnername extrahieren
				int index = folder.LastIndexOf("\\");
				string cop = folder.Substring(index+1);
				Directory.CreateDirectory(destination + "\\" + cop);
				// rekursiver aufruf
				filework(folder,destination + "\\" + cop);
			}
			// Dateien durchgehen
			foreach (string filename in Directory.GetFiles(source))
			{
					int index = filename.LastIndexOf("\\");
					string cop = filename.Substring(index+1);
					if (File.Exists(destination + "\\" + cop))
					{
						File.Delete(destination + "\\" + cop);
						File.Copy(filename,destination + "\\" + cop);
					}
					else
					{
						File.Copy(filename,destination + "\\" + cop);
					}
			}

       }



darkgreetz

Cine