Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Datei kopieren (datei wird verwendet) (https://www.delphipraxis.net/121956-datei-kopieren-datei-wird-verwendet.html)

ghost007 10. Okt 2008 07:23

Re: Datei kopieren (datei wird verwendet)
 
Zitat:

Zitat von nahpets
müsste eher heißen:
Delphi-Quellcode:
//schreibt den inhalt des buffers in das neue file
FileWrite(iFileHandleOut,Buffer,iBytesRead);
SizeOfBuffer ist als Integer deklariert, bekommt aber keinen Wert zugewiesen und ist damit zufällig 0 und genausso groß ist auch die Datei. Mit iBytesRead sollten genauso viele Bytes geschrieben werden, wie vorher gelesen wurden.

So gehts leider auch nicht :(

DeddyH 10. Okt 2008 08:27

Re: Datei kopieren (datei wird verwendet)
 
Ich habe die Prozedur mal "aufgebohrt".
Delphi-Quellcode:
procedure TForm1.CopyEx(const FileName, NewFile: string);
var
  iFileHandleIn,iFileLength,iBytesRead,iBytesWritten:integer;
  buffer:pointer;
  iFileHandleOut,sizeofbuffer:integer;
begin
  //holt sich das handle zum file
  iFileHandleIn := FileOpen(filename, fmShareDenyNone);
  if iFileHandleIn > -1 then
    begin
      //holt sich den pointer auf das ende des files
      iFileLength := FileSeek(iFileHandleIn,0,2);
      if iFileLength > -1 then
        begin
          //setzt den pointer wieder auf den anfang des files
          FileSeek(iFileHandleIn,0,0);
          //reserviert speicher mit der größe des files
          Buffer := PChar(AllocMem(iFileLength + 1));
          if Assigned(Buffer) then
            begin
              //schreibt den inhalt der datei vom anfang bis zum pointer auf das ende in den buffer
              iBytesRead := FileRead(iFileHandleIn, Buffer^, iFileLength);
              //erstellt ein neues file
              iFileHandleOut := FileCreate(NewFile);
              if iFileHandleOut > -1 then
                begin
                  //schreibt den inhalt des buffers in das neue file
                  iBytesWritten := FileWrite(iFileHandleOut,Buffer,SizeOfBuffer);
                  if iBytesWritten = -1 then
                    ShowMessage('Fehler bei FileWrite');
                  //schliesst das neue file
                  FileClose(iFileHandleOut);
                end
              else
                ShowMessage('Fehler bei CreateFile');
            end
          else
            ShowMessage('Buffer nicht zugewiesen');
        end
      else
        ShowMessage('Fehler bei FileSeek');
      //schliesst das file
      FileClose(iFileHandleIn);
    end
  else
    ShowMessage('Fehler bei Fileopen');
end;
Wenn ich nichts übersehen habe, solltest Du dem Fehler nun auf die Spur kommen können.

Kurt56 10. Okt 2008 09:13

Re: Datei kopieren (datei wird verwendet)
 
Zitat:

Zitat von DeddyH
Ich habe die Prozedur mal "aufgebohrt".
Delphi-Quellcode:
procedure TForm1.CopyEx(const FileName, NewFile: string);
var
  iFileHandleIn,iFileLength,iBytesRead,iBytesWritten:integer;
  buffer:pointer;
  iFileHandleOut,sizeofbuffer:integer;
begin
  //holt sich das handle zum file
  iFileHandleIn := FileOpen(filename, fmShareDenyNone);
  if iFileHandleIn > -1 then
    begin
      //holt sich den pointer auf das ende des files
      iFileLength := FileSeek(iFileHandleIn,0,2);
      if iFileLength > -1 then
        begin
          //setzt den pointer wieder auf den anfang des files
          FileSeek(iFileHandleIn,0,0);
          //reserviert speicher mit der größe des files
          Buffer := PChar(AllocMem(iFileLength + 1));
          sizeofbuffer:=iFileLength; //<<<--- die Bufferlänge gesetzt, fehlte noch

          if Assigned(Buffer) then
            begin
              //schreibt den inhalt der datei vom anfang bis zum pointer auf das ende in den buffer
              iBytesRead := FileRead(iFileHandleIn, Buffer^, iFileLength);
              //erstellt ein neues file
              iFileHandleOut := FileCreate(NewFile);
              if iFileHandleOut > -1 then
                begin
                  //schreibt den inhalt des buffers in das neue file
                  iBytesWritten := FileWrite(iFileHandleOut,Buffer^,SizeOfBuffer); //<<<---- das ^ bei Buffer eingefügt
//                                                         ----------
                  if iBytesWritten = -1 then
                    ShowMessage('Fehler bei FileWrite');
                  //schliesst das neue file
                  FileClose(iFileHandleOut);
                end
              else
                ShowMessage('Fehler bei CreateFile');
            end
          else
            ShowMessage('Buffer nicht zugewiesen');
        end
      else
        ShowMessage('Fehler bei FileSeek');
      //schliesst das file
      FileClose(iFileHandleIn);
    end
  else
    ShowMessage('Fehler bei Fileopen');
end;
Wenn ich nichts übersehen habe, solltest Du dem Fehler nun auf die Spur kommen können.

Zwei Kleinigkeiten hab ich noch geändert.
Damit geht es.

DeddyH 10. Okt 2008 09:16

Re: Datei kopieren (datei wird verwendet)
 
Thx, hatte eben nur C&P benutzt und nicht ausprobiert *g*

ghost007 10. Okt 2008 15:41

Re: Datei kopieren (datei wird verwendet)
 
also, der code von euch zwei schmeißt mir die meldung raus "fehler bei fileopen "


... :(

DeddyH 10. Okt 2008 15:48

Re: Datei kopieren (datei wird verwendet)
 
Also klappt schon der Anfang nicht. Hast Du mal so versucht?
Delphi-Quellcode:
iFileHandleIn := FileOpen(filename, fmOpenRead or fmShareDenyNone);

nahpets 10. Okt 2008 15:50

Re: Datei kopieren (datei wird verwendet)
 
Hallo,
Zitat:

Zitat von ghost007
also, der code von euch zwei schmeißt mir die meldung raus "fehler bei fileopen "


... :(

da gibt's nur zewi Möglichkeiten: Die Datei gibt's nicht, dass schließen wir aus oder das andere Programm hat sie exklusiv geöffnet.

Für das
Delphi-Quellcode:
iFileHandleIn := FileOpen(filename, fmShareDenyNone);
gibt es mehrere Möglichkeiten, eine weitere wäre
Delphi-Quellcode:
iFileHandleIn := FileOpen(filename, fmOpenRead or fmShareDenyNone);
In der Hilfe müsstest Du finden, welche Werte ausser fmShareDenyNone, fmOpenRead noch möglich sind. Such Dir diese bitte heraus und versuche es dann mit unterschiedlichen Kombinationen. Welche Kombination zu welchem Zeitpunkt richtig ist, kann ich Dir beim besten Willen nicht sagen.

[OT]und DeddyH ist schon wieder schneller als ich :x [/OT]

ghost007 11. Okt 2008 10:39

Re: Datei kopieren (datei wird verwendet)
 
könnte mir evtl jemand den auszug aus der hilfe hier posten? Unter vista kann ich die hilfe von Delphi 7 nicht mehr aufrufen -.- er sagt das format der hilfe-datei ist zu alt ....

Danke

jaenicke 11. Okt 2008 10:48

Re: Datei kopieren (datei wird verwendet)
 
Mit diesem Download von MS geht die alte Hilfe auch unter Vista ;-):
http://www.microsoft.com/downloads/d...0-334cd175d4bb

ghost007 11. Okt 2008 10:53

Re: Datei kopieren (datei wird verwendet)
 
Zitat:

Zitat von jaenicke
Mit diesem Download von MS geht die alte Hilfe auch unter Vista ;-):
http://www.microsoft.com/downloads/d...0-334cd175d4bb

muchas gracias


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz