Datei im Binäry-Modi öffnen, Inhalt auslesen und dann kopieren.



  • Hallo streamer!

    Danke für deine Vorschläge.
    Der Sinn und Zweck Benutzung der Kalsse fstream ist um die geöffnete Dateien zu kopieren zu können. Natürlich kann man auch so schreiben wie Du vorschlägst, aber Ergebnis bleibt unverändert.
    Methoden CopyFile() und CopyFileTo() kopiert keine geöffnete (.pst) oder (.gdb) Dateien, viele andere -> Word ,Excel, PDF, .... schon.

    Darum das Problem bleibt nach wie vor offen. 😉



  • wie wärs damit?

    fstream in, out;
    in.open(datei1,ios::in|ios::binary);
    out.open(datei2,ios::out|ios::binary);
    unsigned char c;
    
    while(1)
    {
       in >> c;
       if(in.eof())
          break;
       out.put(c);
    }
    in.close();
    out.close();
    

    greetz KN4CK3R



  • Hallo,

    leider das Ergebnis auch mit diesem Versuch ist negativ.
    Danke trotzdem!



  • Hallo

    std::stream dürfte dir da kaum weiterhelfen. Denn die Sperre wird nicht von einer Funktion der C++ Schicht verursacht, sondern von Windows. Du wirst diese Sperre, wenn überhaupt möglich, auch nur mit Windows-Mitteln umgehen können.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo alle zusammen,

    kann mir jemànd helfen?



  • Das Problem wird wohl sein, in welchem Modus der Besitzer der Datei die Datei geöffnet hält. Wenn er absichtlich keinen shared Zugriff erlaubt geht´s einfach nicht, da hilft dir keine Funktion der WinAPI weiter. Du kannst diesen Schnipsel mal ausprobieren, der kann zumindest geöffnete Dateien kopieren, wenn der Besitzer Lesezugriffe erlaubt. Die Unterverzeichnisstruktur musst du ggf. selbst erzeugen, d.h. der Verzeichnisbaum muss bereits existieren.

    #include <string>
    #include <vector>
    
    #include <windows.h>
    
    using namespace std;
    
    void copy_file( const string& source, const string& target )
    {
    	HANDLE hSource = ::CreateFile( source.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, NULL );
    	if( INVALID_HANDLE_VALUE == hSource )
    	{
    		return;
    	}
    	HANDLE hTarget = ::CreateFile( target.c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    	if( INVALID_HANDLE_VALUE == hTarget )
    	{
    		::CloseHandle( hSource );
    		return;
    	}
    	const unsigned int BufferSize = 256 * 1024;
    	vector<char> Buffer( BufferSize );
    	DWORD dwReadCount = 0;
    	DWORD dwWriteCount= 0;
    	if( ::ReadFile( hSource, &Buffer[0], BufferSize, &dwReadCount, NULL ) )
    	{
    		while( dwReadCount != 0 )
    		{
    			::WriteFile( hTarget, &Buffer[0], dwReadCount, &dwWriteCount, NULL );
    			::ReadFile( hSource, &Buffer[0], BufferSize, &dwReadCount, NULL );
    		}
    	}
    	::CloseHandle( hSource );
    	::CloseHandle( hTarget );
    }
    


  • Ab WindowsXP kann man geöffnete Dateien über den Volume Shadow Copy Service öffnen (bzw. einen Snapshot davon):
    http://de.wikipedia.org/wiki/Volume_Shadow_Copy_Service

    ...weniger aufwändig wäre sich einfach durch ein Kommandozeilen-Tool die ShadowCopy-Arbeit abnehmen zu lassen (z.B. hobocopy)



  • @DocShoe:
    Dateien die man damit kopieren kann, kann man mit sogut wie jeder Funktion (inklusive CopyFile) kopieren, da du bei der Quelldatei nur FILE_SHARE_READ übergibst.

    Das stellt zwar sicher dass keiner die Datei ändern kann während du kopierst, aber dafür kann man auch keine Dateien kopieren, die irgendein Programm zum Schreiben offen hat.

    Wenn dann müsste man zumindest FILE_SHARE_READ | FILE_SHARE_WRITE (und evtl. noch FILE_SHARE_DELETE) angeben - nur dann kann man eben nichtmehr sicher sein eine "unbeschädigte" Kopie des Files zu bekommen.



  • kann sich vll auch jemand mein Problem mit dem binären lesen von Dateien anschauen?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-244359.html

    greetz


Anmelden zum Antworten