![]() |
Filestream Datei nicht gefunden bei FOpenWrite
Delphi-Quellcode:
Compiler meldet Datei nicht gefunden..
if (FileExists(FileOne)) then
begin GetImageSizeFromFile(FileOne, Width, Height); FileStream := TFileStream.Create(FileOne, fmOpenRead); if FileStream.Handle <> INVALID_HANDLE_VALUE then begin BufferSize := FileStream.Size; SetLength(sBuffer, BufferSize); FileStream.Read(sBuffer[0], BufferSize); if Assigned(sBuffer) then begin Offset := BufferSize + 1; FileStream.Free; FileStream := TFileStream.Create(FileOut, fmOpenWrite); Logisch die will ich doch mit
Delphi-Quellcode:
TFileStream.Create(FileOut, fmOpenWrite);
erst erstellen. Hab ich da nen Denk Fehler ? Mit
Delphi-Quellcode:
CreateFile(PWideChar(FileOut), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
funktioniert es mit dem FileStream aber nicht. gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Probiere es mal mit fmCreate. |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Nur kann man dann noch schreiben ? EDIT: Ach ich mache es mit der API. Zuviel Stress jetzt ;) gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
![]() |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Aber auf deinen Tip wäre ich nicht gekommen. Thema hat sich erledigt! Habe es mit Win32 API mitteln gemacht. gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
fmCreate erstellt eine neue Datei und überschreibt notfalls eine Besehende. fmOpenWrite öffnet eine bestehende Datei und löscht dabei den Inhalt. Und genau das selbe Problem hat man auch mit der WinAPI, wenn man da eben statt CREATE_ALWAYS (fmCreate) ein TRUNCATE_EXISTING (fmOpenWrite) verwendet. Zitat:
|
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Verstehe dich nicht so ganz. Die API ist ein ganzes Stück komplizierter und unbequemer. Du musst natürlich selbst wissen wie du gerne programmieren möchtest aber die direkte Nutzung der Windows API ist eigentlich nur selten notwendig. Mit den Klassen oder Funktionen der RTL wird dein Code deutlich einfacher und übersichtlicher und diese Klassen sind grundlegend einfacher zu benutzen als die APIs. Mit ein wenig Einarbeitung könntest du dir theoretisch ne Menge Arbeit/Ärger sparen ;) |
AW: Filestream Datei nicht gefunden bei FOpenWrite
OK, die alten Konstanten haben ein paar Nachteile, gegenüber aktuelleren Implementationen mit Enums.
Oder man nimmt die aktuellere API ![]() TFile.Exists TFile.Create TFile.Open TFile.OpenRead TFile.OpenWrite (fmOpenWrite) TFile.Delete TFile.AppendText TFile.OpenText TFile.ReadAllLines TFile.ReadAllText TFile.ReadAllBytes, wobei hier bestimmt eine Variante mit Offset+Länge auch ganz nett wäre. (kann man sich aber über Class Helper nachrüsten, wenn Emba das nicht hinbekommt) uvm. PS: API? Windows-API (z.B. Win32 ... heißt unter 64 Bit genauso, da die selben Schnittstellen ... WinRT wäre eine andere Windows-API) Delphi-API (z.B. RTL) |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Läuft doch alles auf's gleiche raus.
Wenn ich bei der API oder bei TFile die falsche Funktion/Parameter nehme, geht's halt nicht/kommt ne Exception. Und, soooo kompliziert ist TFileStream je nun auch nicht. In Anbetracht des obigen Codes wäre das ein Parameter zu ändern gewesen. Somit verstehe ich die ganze Diskussion nicht. ;-) |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Das sieht man ja auch daran das ich teilweise immer wieder aufstoße (Hier nachfragen muss) wenn es um die VCL geht. Das mit der WinApi mache ich nicht wegen der kleinen Dateien sondern deshalb weil ich es gewohnt bin. Die Macht der Gewohnheit halt :) Zitat:
gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
[Sarkasmus ein]Und im Zweifelsfall hat der Liebe Gott auch die F1-Taste erfunden [Sarkasmus aus] Zitat:
|
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Tja so geht das ;) Passiert mir unter Win32Api nicht. Das sind die feinen Unterschiede. ABER! So geht's auch..
Delphi-Quellcode:
Ich hoffe habe dich jetzt nicht erschlagen.
procedure TfrmMain.btnOpenGifClick(Sender: TObject);
var AniHeader: TAniHeader; Width, Height, W, H: single; DC: HDC; Graphics: GpGraphics; imgOUT: GPImage; TempPath: string; Ext: string; FileOut: string; Result: GPStatus; img, NewImg: GPImage; imgW, imgH: single; sBuffer: TBytes; offset: dword; FileReplaceExt: string; FileName: string; hFileOut: THandle; size: DWORD; dwBytesRead, dwByttesWritten: DWORD; begin Result:= GenericError; OpenDialog := TOpenDialog.Create(self); OpenDialog.InitialDir := GetCurrentDir; OpenDialog.Options := [ofFileMustExist]; OpenDialog.Filter := 'Animate Gifs|*.gif'; if OpenDialog.Execute then begin Ext := ExtractFileExt(OpenDialog.FileName); if Ext = '.gif' then begin imgOUT := CreateMultiFrame(PWideChar(OpenDialog.FileName), AniHeader, 512); if Assigned(imgOUT) then begin Ext := '.png'; FileReplaceExt := StringReplace(OpenDialog.FileName, '.gif', '.png', [rfReplaceAll]); FileName := ExtractFileName(FileReplaceExt); TempPath := SysUtils.GetEnvironmentVariable('temp'); FileOut := TempPath + '\' + FileName; Result := SaveToPNG(PWideChar(FileOut), imgOUT); if Result = OK then begin lblStatus.Caption := 'Status = Ok'; FileIn := PWideChar(FileOut); if FileExists(FileIn) then begin FileOut := FileReplaceExt; FileOne := PWideChar(TempPath + '\PNG_ani1.png'); FileTwo := PWideChar(TempPath + '\PNG_ani2.png'); GdipLoadImageFromFile(FileIn, img); GPStatus(GdipGetImageDimension(img, imgW, imgH)); if Assigned(img) then begin DC := GetDC(0); if GdipCreateFromHDC(DC, Graphics) = OK then begin if GdipCreateBitmapFromGraphics(AniHeader.Width, AniHeader.Height, Graphics, NewImg) = OK then begin if GdipCloneBitmapAreaI(0, 0, AniHeader.Width, AniHeader.Height, PixelFormat32bppARGB, img, NewImg) = OK then begin SaveToPNG(FileOne, NewImg); GdipDisposeImage(NewImg); end; end; if GdipCreateBitmapFromGraphics(round(imgW - AniHeader.Width), AniHeader.Height, Graphics, NewImg) = OK then begin if GdipCloneBitmapAreaI(AniHeader.Width, 0, round(imgW - AniHeader.Width), AniHeader.Height, PixelFormat32bppARGB, img, NewImg) = OK then begin SaveToPNG(FileTwo, NewImg); GPStatus(GdipDisposeImage(NewImg)); end; end; GPStatus(GdipDeleteGraphics(Graphics)); end; ReleaseDC(0, DC); GPStatus(GdipDisposeImage(img)); end; if FileExists(FileOne) then begin GetImageSizeFromFile(FileOne, Width, Height); hFileIn := CreateFile(FileOne, FILE_READ_DATA, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hFileIn <> INVALID_HANDLE_VALUE then begin size := GetFileSize(hFileIn, nil); Setlength(sBuffer, size); if (ReadFile(hFileIn, sBuffer[0], size, dwBytesRead, nil)) then begin offset := size + 1; CloseHandle(hFileIn); hFileOut := CreateFile(PWideChar(FileOut), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if hFileOut <> INVALID_HANDLE_VALUE then begin WriteFile(hFileOut, sBuffer[0], size, dwByttesWritten, nil); if FileExists(FileTwo) then begin GetImageSizeFromFile(FileTwo, W, H); hFileIn := CreateFile(FileTwo, FILE_READ_DATA, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hFileIn <> INVALID_HANDLE_VALUE then begin size := GetFileSize(hFileIn, nil); Setlength(sBuffer, size); dwBytesRead := 0; if ReadFile(hFileIn, sBuffer[0], size, dwBytesRead, nil) then begin dwByttesWritten := 0; WriteFile(hFileOut, sBuffer[0], size, dwByttesWritten, nil); AniHeader.Frame := round((W / Width)) + 1; AniHeader.Width := round(Width); AniHeader.Height := round(Height); if AniHeader.Frame < 4 then AniHeader.Speed := 75 else if AniHeader.Frame < 8 then AniHeader.Speed := 50 else if AniHeader.Frame < 12 then AniHeader.Speed := 37 else AniHeader.Speed := 30; end; end; AniHeader.offset := offset; AniHeader.reserved := 0; AniHeader.Sign := ANIM; dwByttesWritten := 0; WriteFile(hFileOut, AniHeader, sizeof(AniHeader), dwByttesWritten, nil); end; // end FileExists(FileTwo) CloseHandle(hFileIn); end; //end hFileOut <> INVALID_HANDLE_VALUE CloseHandle(hFileOut); end; // end (ReadFile(hFileIn, sBuffer[0], size, dwBytesRead, nil)) end; // end hFileIn <> INVALID_HANDLE_VALUE end // end FileExists(FileOne)L else CloseHandle(hFileIn); end; end; // end Result = OK FileOut := FileOut + 'Frame count =' + IntToStr(AniHeader.Frame); MessageBox(0, PWideChar(FileOut), 'GIFtoAPNG', 0); DeleteFile(FileOne); DeleteFile(FileTwo); DeleteFile(FileIn); end; // end Assigned(imgOUT) end; // end Ext := '.gif' end // end OpenDialog.Execute else begin lblStatus.Caption := 'Status = ' + (cStatus[Result]); end; if AniHeader.Frame = 0 then lblStatus.Caption := 'Status = ' + (cStatus[Result]); OpenDialog.Free; end; gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Zitat:
Da gibt es nicht um das Positionieren eine Zeigers, sondern darum eine Datei zu erzeugen. Letztlich ist es mir ja egal, ob du das mit TFileStream, TFile, API, oder sonst wie machst. Mich wunderte nur die Reaktion, Ala "Nee, lass mal. Ich mach's jetzt mit der API, da kenn ich mich eh aus", obwohl sich andere die Mühe machen dir die Lösung zu präsentieren. |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Weil ich damit besser umgehen kann. Und damit sich dann niemand mehr mit meinem Problem befasst habe ich das mitgeteilt was ist daran falsch? ;) gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
|
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Ich war froh das ich damit erst mal fertig war. gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Na ja gut, wenn du es noch "schön" machst. :wink:
Ich denke immer an das was R. Buckminster Fuller (1895 - 1983), American Architect, Author, Designer, Inventor, and Futurist gesagt hat: Zitat:
|
AW: Filestream Datei nicht gefunden bei FOpenWrite
Ist schon richtig innerhalb von OpenDialog ist eine schlechte Idee.
Aber solange es geht ? LOL :duck: gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Nur, wie sieht es mit der Wiederverwertbarkeit aus? Oder du baust die Oberfläche um? Dann musst du alles auseinander zupfeln und wieder neu zusammenflicken. Und wie gesagt, die Länge und die ein Dutzend lokalen Variablen sind das Schlimme. In Funktionen zerlegen (besser Klasse) und in eine separate Unit (Datei) packen.
|
AW: Filestream Datei nicht gefunden bei FOpenWrite
Bei so tiefer Verschachtelung bietet sich übrigens wieder die Methode mit
Delphi-Quellcode:
..
try
Delphi-Quellcode:
Block an, über die wir schonmal in einem anderen Thread geredet hatten. Also Statt:
finally
Delphi-Quellcode:
einfach
if (X) then
begin if (Y) then begin if (Z) then begin .. Free(Z); end; Free(Y); end; Free(X); end;
Delphi-Quellcode:
Vorher natürlich Luckies Tipp befolgen und möglichst viel in logisch sinnvolle Funktionen/Methoden auslagern.
try
if (not X) then Exit; if (not Y) then Exit; if (not Z) then Exit; .. finally if (X) then Free(X); if (Y) then Free(Y); if (Z) then Free(Z); end; |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Ist ja nur ein kleines Dialog Window. gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
Aber wie gesagt heute morgen war ich erst mal froh das alles funktioniert hat. gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
|
AW: Filestream Datei nicht gefunden bei FOpenWrite
Zitat:
gruss |
AW: Filestream Datei nicht gefunden bei FOpenWrite
Meine Erfahrung mit Umfangreicheren Aufgaben, sind dass ich da den umgekehrten Weg gehe.
Früher habe ich auch erstmal alles der Nase nach runtergeschrieben, und danach in sinnvolle Funktionen und Klassen umgebaut. Heute mache ich mir schon vorher Gedanken über den Ablauf und mache mir gleich die passenden Funktionen und lege mir vereinfachende Klassen an. Das hat sich bewährt, weil man sich einfach weniger verzettelt, und viele Probleme von Anfang an vermeidet. Darüber hinaus schreibt man dann den Code oft nur einmal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz