relative Pfadangabe bei FileCopy()

Hallo,

Ich möchte zum Kopieren einer Datei die Funktion FileCopy() verwenden.

Anwendung ist folgendermaßen:

CopyFile((LPCTSTR)"Datei1.txt",(LPCTSTR)"Datei2.txt",0);
cout << GetLastError();

Dabei bekomme ich den Fehlercode 2 -> Datei nicht gefunden.

Nun die Frage, wie kann ich eine relative Pfadangabe einfügen, so dass es funktioniert.
Ich habe bereits ein wenig gesucht und Versionen wie ".\Datei.txt" und "./Datei.txt" gefunden.

Leider bisher ohne Erfolg.

Gruß,
WilliamSpiderWeb
 
Hallo,

es sollten beide Varianten funktionieren, die erste im Sourcecode natürlich als ".\\Datei.txt" geschrieben. Allerdings musst du natürlich genau wissen, was gerade dein aktueller Pfad ist, damit die relative Pfadangabe auch passt.

Gruß
MCoder
 
Keine Chance,

Selbst wenn ich auf Nummer sicher gehe und das Programm nicht aus der Entwicklungsumgebung lade, sondern die erstellte *.exe direkt starte, erscheint der Fehlercode 2.

Dabei wird folgender Code verwendet:
bool TEST = CopyFile((LPCTSTR)".\\Datei1.txt",(LPCTSTR)".\\Datei2.txt",0);
und die Datei1.txt direkt in den Ordner der *.exe kopiert.



Eine andere Datei habe ich mit
ifstream infile(strPath.c_str)
geöffnet.
Kann ich herausfinden, wie der absolute Pfad dieser Datei ist? Dann kann ich mein Problem umgehen.

Gruß,
WilliamSpiderWeb
 
Zuletzt bearbeitet:
Hallo,

wenn deine zu kopierenden Datei in irgendeiner Beziehung zum Pfad der EXE stehen, kannst du über GetModuleFileName() den Pfad der EXE ermitteln und dir daraus dann absolute Pfade bauen. Damit gehst du allen Problemen aus dem Weg.

Eine andere Datei habe ich mit
ifstream infile(strPath.c_str)
geöffnet.
Kann ich herausfinden, wie der absolute Pfad dieser Datei ist? Dann kann ich mein Problem umgehen.
Wenn strPath ein absoluter Pfad ist, brauchst du nur den Dateinamen abzutrennen. Ansonsten kannst du mit GetCurrentDirectory() den aktuellen Pfad ermitteln und dann entsprechen der relativen Pfadangabe bei der Datei ebenfalls einen absoluten Pfad erzeugen.

Gruß
MCoder
 
Hallo,

leider verhalten sich die Pfadbeziehungen bei mir nicht ganz so.

Es gibt zwei Dateien, die von meiner exe bearbeitet werden sollen.
Eine wird über ifstream ausgelesen und die andere wird über ofstream erstellt und anschließend soll sie über CopyFile umkopiert werden.

Bei ifstream und ofstream habe ich bisher keinen Pfad angegeben, das heißt, die Dateien befinden sich im Ordner der exe. Bei CopyFile funktioniert das ohne Pfadangabe (wie beschrieben) bisher nicht.

Der Speicherort der zu lesenden Datei (über ifstream) wird vom User festgelegt, daher kann der Dateiname den Pfad enthalten, oder auch nicht.

Die zweite Datei (ofstream und CopyFile) wird entweder in den Ordner geschrieben, in dem sich die erste Datei auch befindet, oder aber ihr Pfad wird aus der ersten Datei herausgelesen.

Daher würde es mir helfen, zu wissen, wie der absolute Pfad der ersten Datei ist, nicht aber der Pfad der exe.

Gruß,
WilliamSpiderWeb
 
Daher würde es mir helfen, zu wissen, wie der absolute Pfad der ersten Datei ist, nicht aber der Pfad der exe.
Wie schon gesagt, wenn diese erste Datei einen Pfadnamen enthält, ist die Information ja vorhanden. Fall nicht, wird's komplizierter. Dann kann sie entweder im aktuellen Pfad oder in einem der in der PATH-Umgebungsvariable eingetragenen Pfade liegen. Diese müsste man untersuchen, um die Datei zu finden bzw. den absoluten Pfad zu ermitteln.

Alternativ könntest du ja auch eine eigene Kopierfunktion mit den Streamklassen schreiben, wenn die der Windows-API so viel Ärger macht. Das könnte etwa so aussehen:
C++:
bool FileCopy(string strSrcFile, string strDstFile)
{
    ifstream srcFile(strSrcFile.c_str(), ios::binary);
    ofstream dstFile(strDstFile.c_str(), ios::binary);

    if( !srcFile.is_open() || !dstFile.is_open() )
    {
        return false;
    }

    const unsigned int BUF_SIZE = 4096;
    char pbBuffer[BUF_SIZE];

    while( true )
    {
        srcFile.read(pbBuffer, BUF_SIZE);

        int nBytesRead = srcFile.gcount();

        if( !nBytesRead )
        {
            break;
        }
            
        dstFile.write(pbBuffer, nBytesRead);
    }

    srcFile.close();
    dstFile.close();

    return true;
}
Gruß
MCoder
 
Vielen Dank,

Die Selbstschreib-Variante funktioniert einwandfrei.

Ich habe vorher noch einmal versucht Dateien mit CopyFile zu kopieren, und habe den Pfad dabei so weit vereinfacht, dass es nicht mehr an der Pfadangabe liegen konnte ("C:\\File.tmp") und trotzdem wurde immer der Fehlercode 2 zurückgeliefert.

Aber wie gesagt, über fstream ist das Problem nun gelöst.

Danke,
Gruß,
WilliamSpiderWeb
 

Neue Beiträge

Zurück