Dateien kopieren mit relativen Pfaden

Eroli

Erfahrenes Mitglied
Hallo zusammen,

ich muss eine Datei aus

%PartitionWoWindowsInstalliertIst%/Dokumente und Einstellungen/%Benutzername%/Lokale Einstellungen/Anwendungsdaten/Noch ein Ordner

kopieren.
Dabei stört mich:
1. Nicht jeder hat sein Windows auf c installiert
2. Ich weiß den Benutzernamen nicht
3. Ich weiß nicht ob es ein deutsches oder englisches system ist(Dokumente und Einstellung oder Documents and Settings)

Wie komme ich nun an "Noch ein Ordner" ran mit relativen Pfadangaben? Geht das irgendwie?

Eroli

EDIT: Um genau zu sein geht es um eine "Anwendungskonfigurationseinstellungen"-Datei eines Programmes. Diese Datei will ich kopieren und bei einem anderem Programm einfügen.
 
Zuletzt bearbeitet:

Nico Graichen

Erfahrenes Mitglied
Hi

Die Klassen Environment und Path sollten dir weiter helfen. Beide bieten Möglichkeiten um das Programmverzeichnis, oder das User-Profil abzufragen.
 

Eroli

Erfahrenes Mitglied
Environment ist schlecht, ich kriege damit keinen Pfad sondern nur ein "History" zum Beispiel.

Path hilft mir auch nicht wirklich weiter - oder ich bin zu doof(oder zu müde?) :-/
 
Zuletzt bearbeitet:

Twinsetter

Mitglied
Dein Prob sollte eigentlich nicht so schwierig sein. Auch unter Windows gibt es Enviromentvariablen die man abfragen kann. Dies sollte auch unter .Net möglich sein.
Ich weis ja nicht womit Du .Net programmierst. Für Delphi gibt es Komponenten bzw. Funktionen, die genau die Informationen zurück liefern, die Du benötigst. Falls Du mit .Net die gewünschten Funktionen nicht vernünftig erzeugen kannst, würde ich einfach z.B. mit Delphi eine DLL zusammenbauen, die genau dies tut und diese dann von Deinem .Net Projekt aus aufrufen. Dies habe ich schon mal in einem C++ Projekt gemacht, weil ich für die gewünschte Funktion keine vernünftige C++ Lösung gefunden habe.
Falls Du Dich für den Einsatz einer DLL erwärmen kannst könnte ich Dir dabei behilflich sein, da ich ähnliche Abfragen in einem größeren Programmprojekt von mir auch schon implementiert habe. Notfalls würde ich Dir auch eine passende DLL zusammen basteln, wenn es nicht gleich gestern sein muß.
Falls Du selber mit Delphi programmierst würde ich Dir diese Seite http://swissdelphicenter.chempfehlen. Dort ist unter Programmiertips beschrieben, wie Du unter Delphi an Deine gewünschten Infos kommst.
Hoffe, daß ich Dir weiter helfen konnte

Gruß Thomas
 

Nico Graichen

Erfahrenes Mitglied
Environment ist schlecht, ich kriege damit keinen Pfad sondern nur ein "History" zum Beispiel.

Path hilft mir auch nicht wirklich weiter - oder ich bin zu doof(oder zu müde?) :-/

Ich sag mal zu müde ;)

Die Klasse Environment bietet die Methode GetFolderPath. Mit der kannst du die Pfade abfragen. Mit der Klasse Path kannst du die Pfade für deine Unterverzeichnisse weiter zusammen bauen
 

Eroli

Erfahrenes Mitglied
Danke für das Müde ;)

Ja, ob du es glaubst oder nicht, da bin ich gestern auch noch draufgekommen.
Total motiviert hab ich dann weitergebastelt, aber mein Pfad ist gut 300 Zeichen lang und hier beginnt das .NET Framework zu streiken.
Es unterstützt nur Pfade bis 256 Zeichen.

DAS IST EIN RICHTIG DUMMES PROBLEM!

Kennt ihr Tricks oder sonstige Hilfen wie ich das Problem lösen kann?
(Ich kann die Ordnerstruktur von Windows NICHT verändern:) und ich möchte nur eine Datei kopieren....)


Mfg;
Eroli
 

Twinsetter

Mitglied
Pfad mit 300 Zeichen ? Ist ja mächtig lang - kann ich fast gar nicht glauben. Wenn es da unter :NET eine Begrenzung gibt, dann wirst Du die nicht so ohne weiteres umgehen können.
Versuch doch mal ob Du Schritt für Schritt in das Verzeichnis wechseln kannst. Dann könnte man ja der Kopierfunktion einfach die Quelle (Datei mit kompl. Pfad) und das Ziel (Datei ohne Pfad) übergeben. Die Quelle darf dann natürlich nicht länger als 256 Zeichen sein. Ob es so funktioniert weis ich auch nicht genau - war bloß mal so'ne Idee.
Eine Möglichkeit wäre noch, wie schon angedeutet, das komplette Kopierprocedere in eine DLL auszulagern, wobei diese dann mit einer Sprache programmiert sein muß die solche langen Strings (Pfade) unterstützt. Da das ganze dann innerhalb der DLL abläuft ist es ja von .NET völlig unabhängig. Der Prozeß muß halt nur durch Dein Programm angestoßen werden.
 

Eroli

Erfahrenes Mitglied
Ok bin schon einige Schritte weiter.
Zu erst mal muss ich ein virtuelles Laufwerk erzeugen, dass sagen wir mal die hälfte des Pfades schluckt - unter cmd geht das so:
Code:
subst m: D:\Pfad
dann hab ich m und dann kann ich weitermachen - also die andere Hälfte des Pfades nehmen.

Nur wie kann ich Befehle über cmd.exe in C# ausführen?
Oder direkt ein subst über C#?
 

Twinsetter

Mitglied
Hallo Eroli,

schau mal hier http://www.wer-weiss-was.de/theme205/article2442886.htmlnach, da solltest Du fündig werden.
Bei http://board.gulli.com/thread/225456-visual-c--konsole-auslesen-/ wurde folgender Code gepostet:
Code:
/* **************** */ 
/* programm starten */ 
/* ****************** */ 
ProcessStartInfo programmInfo = null; 
Process starteProgramm = null; 


// startinfos zum externen programm angeben (dateiname, etc.) 
aufnahmeInfo = new ProcessStartInfo(); 
aufnahmeInfo.FileName = "C:\\Programme\\ordner\\datei.exe"; 
aufnahmeInfo.Arguments = ""; 
aufnahmeInfo.UseShellExecute = false; 
aufnahmeInfo.RedirectStandardInput = true; 
aufnahmeInfo.RedirectStandardOutput = true; 
aufnahmeInfo.RedirectStandardError = true; 


// das externe programm starten 
starteAufnahme = new Process(); 
starteAufnahme.StartInfo = aufnahmeInfo; 
starteAufnahme.Start(); 
/* ****************** */ 
/* programm gestartet */ 
/* ****************** */ 
--

Bei Arguments kannst Du Dein zu startendes Programm mit Parametern angeben.

Aber so richtig elegant ist Dein Weg nicht. Was machst Du wenn auf dem Rechner, um bei Deinem Beispiel zu bleiben, das Laufwerk M bereits vergeben ist?

Versuche doch mal folgenden Weg. Erstelle durch Dein Programm eine temporäre .BAT- oder unter XP eine .CMD- Datei. In diese schreibst Du alle Befehle die Du ausführen möchtest. Anschließend Datei ausführen und löschen.

Wie wäre es, wenn Du die ganze Kopierei über das Windows-API ablaufen läßt, da sollten die langen Dateinamen eigentlich kein Problem darstellen, denn Windows verwaltet diese Pfade ja auch irgendwie. Wie das API unter C# anzusprechen ist kann ich Dir allerdings nicht sagen. Ich könnte Dir aber aus meinem installierten Delphi eine Hilfedatei zum Windows API zusenden.

Ich habe mal 2 Links rausgesucht, die weiter helfen könnten:
http://www.bakterienkultur.de/forum/viewtopic.php?t=515&start=0&postdays=0&postorder=asc&highlight=
http://www.robsite.de/tutorials.php?tut=liste

Bei letzterer Url gibt es einige Tutorials, auch zum Thema C#, vielleicht wirst Du dort fündig.

Gruß Thomas