Datei im Binäry-Modi öffnen, Inhalt auslesen und dann kopieren.
-
Hallo alle zusammen!
Ich habe wieder mal ein Problem. Ich möchte ein Datei kopieren
Die Datei muss hierzu im Binary-Mode geöffnet, der Inhalt ausgelesen und dann kopiert werden.
Bisher habe ich versucht:
DateiKopieren(char quelle[], char ziel[]) { ifstream infile(quelle, ios::binary); if(infile.good()) { AnsiString S = ziel + ExtractFileName(AnsiString(quelle)); int i = DateGroesseErmitteln(AnsiString(quelle)); ofstream outfile(S.c_str(), ios::binary); if(outfile.good()) outfile.write((char*)&infile, i); ShowMessage("Öffnen gelungen"); outfile.close(); } }Mir fehlt ein fstream Buffer wo ich den Inhalt erst einlesen kann!
Hat jemand ein Idee?
-
if(OpenDialog1->Execute()) { SaveDialog1->Execute(); ifstream in(OpenDialog1->FileName.c_str(),ios_base::in | ios_base::binary); ofstream out(SaveDialog1->FileName.c_str(),ios_base::out | ios_base::binary); out << in.rdbuf(); out.close(); in.close(); }
-
Danke für den Code,
ich dachte dass mit diese Vorgehensweise könnte man auch die geöffnete Dateien (bzw. *.pst) kopieren, das ist leider nicht der Fall, obwohl unter VisualBasic sollte es auf diese Weise gehen:
http://www.vbarchiv.net/tipps/details.php?id=783Ich denke es muss auch unter C++ möglich sein die geöffnete Dateien zu kopieren.
Die Frage ist mit welcher Methode?
-
Du kannst dann mit
in.seekg(ios::beg);wieder zurücksetzen
-
An welcher stelle?
-
Sorry, schon so lange her ... an den Anfang
in.clear(); in.seekg (0L, ios::beg);
-
Ich habe folgendes:
char quelle[]; char ziel[]; AnsiString zS; if(strlen(ziel) <= 3) /* AnsiString */zS = ziel + ExtractFileName(AnsiString(quelle)); else zS = AnsiString(ziel) + "\\"+ ExtractFileName(AnsiString(quelle)); ifstream in(quelle,ios_base::in | ios_base::binary); in.clear(); in.seekg (0L, ios::beg); ofstream out(zS.c_str(),ios_base::out | ios_base::binary); out << in.rdbuf(); out.close(); in.close();Ergebnis nach wie vor, negativ!
Sorry ich habe zS doppelt deklariert gehabt! 27.06.09
-
Also wenn das alles an Code ist, dann fällt natürlich erstmal auf, das der Quelldateiname fehlt.
-
Guten morgen,
Der Quelldateiname ist "quelle[]".
Also volständig siet so aus:void __fastcall TForm1::OffeneDateiKopieren(char quelle[], char ziel[]) { AnsiString zS; if(strlen(ziel) <= 3) zS = ziel + ExtractFileName(AnsiString(quelle)); else zS = AnsiString(ziel) + "\\"+ ExtractFileName(AnsiString(quelle)); ifstream in(quelle,ios_base::in | ios_base::binary); in.clear(); in.seekg (0L, ios::beg); ofstream out(zS.c_str(),ios_base::out | ios_base::binary); out << in.rdbuf(); out.close(); in.close(); } //---------------------------------------------------------------------------Aufruf:
OffeneDateiKopieren(Edit1->Text.c_str(), Edit2->Text.c_str());Wo Edit1-Text voller qualfizierter Pfad der Quelldatei vom OpenDialog und
Edit2->Text der Pfad des Ordners von BrowseForFolder ist.Bei dem Kopieren wird die Zieldatei richtig angelegt, nur inhalt bleibt dann Null Bytes (wenn die Queldatei geöffnet ist).
-
Entweder
OffeneDateiKopieren(char *quelle, char *ziel)oder
OffeneDateiKopieren(String quelle, String ziel)oder besser fürs Kopieren gleich
CopyFile
oder CopyFileTo
-
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.htmlgreetz