FileCreate

Für Fragen von Einsteigern und Programmieranfängern...
kmesch
Beiträge: 6
Registriert: Mi 15. Jun 2022, 17:42

FileCreate

Beitrag von kmesch »

Hallo,
ich habe folgendes Problem: Ich habe ein Verzeichnis mit Bildern. Wird das Programm ausgeführt, werden zu den Bildern entsprechene Textdateien über FildeCreate generiert, sofern noch keine vorhanden sind. Diese dienen dazu die Bilder "zu beschriften". Das Programm generiert die Textdateien auch, kann sie aber nicht öffnen. Ich muss zuerst das Programm schließen und wieder öffnen, dann stehen sie zur Verfügung. Kann mir einer weiterhelfen?

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: FileCreate

Beitrag von PascalDragon »

Zeig doch mal bitte, was du genau machst. Sonst ist das schwer zu beurteilen.
FPC Compiler Entwickler

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: FileCreate

Beitrag von m.fuchs »

Weiterhelfen? Bestimmt, wenn du uns mal den relevanten Quellcode zeigst.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FileCreate

Beitrag von Warf »

Das liegt daran das filecreate die Datei nichz nut erstellt sondern auch zum schreiben öffnet und dir ein handle dafür zurückgibt. Da eine datei in Windows nur von einem prozess gleichzeitig zum schreiben geöffnet sein kann, musst du wenn du die Datei anders lffnen willst (z.b. via assign oder filestream) du das handle erst schliessen musst

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: FileCreate

Beitrag von theo »

Für Texte würde ich es so machen:

Code: Alles auswählen

var SL:TStringList;
begin
 SL:=TStringList.Create;
 SL.Text:='Schreibwas';
 SL.SaveToFile('Meins.txt');
 SL.Free;   
end;

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: FileCreate

Beitrag von wp_xyz »

Oder mache es auf die klassische Pascal-Art und lass das Windows-Gedöns mit FileCreate beiseite:

Code: Alles auswählen

var
  F: TextFile;
begin
  AssignFile(F, 'Meins.txt');
  Rewrite(F);
  WriteLn(F, 'Schreib eine Zeile...');
  WriteLn(F, '... und noch eine...');
  WriteLn(F, 'Jetzt reichts.');
  CloseFile(F);
end;

kmesch
Beiträge: 6
Registriert: Mi 15. Jun 2022, 17:42

Re: FileCreate

Beitrag von kmesch »

Die Fehlermeldung "Unable to open "Pfad...Datei" wird ausgegeben, wenn ich versuche über 'LoadFromFile' auf die Datei zuzugreifen.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: FileCreate

Beitrag von Winni »

Hi!

Sagt er Dir doch:

Pfad- oder/und Dateiname ist falsch angegeben.

Wurde oben schon gesagt:

Zeig mal ein bischen Code.
Bei der Angabe von Pfad- und Dateinamen wäre dann auch noch das Betriebssystem wichtig

Winni

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: FileCreate

Beitrag von Warf »

Winni hat geschrieben:
Do 16. Jun 2022, 20:29
Sagt er Dir doch:

Pfad- oder/und Dateiname ist falsch angegeben.
Nicht unbedingt, das ist eine Möglichkeit

Code: Alles auswählen

  TStringList.Create.LoadFromFile('DateiDieNichtExisitert');
Wirft ne Exception mit Meldung:

Code: Alles auswählen

Unable to open file "DateiDieNichtExisitert": Das System kann die angegebene Datei nicht finden.
Aber es gibt noch andere Gründe die diese Meldung werfen können, z.B. da FileCreate angesprochen wurde:

Code: Alles auswählen

  FileCreate('DateiDieNichtExisitert');
  TStringList.Create.LoadFromFile('DateiDieNichtExisitert');  
Wirft (auf Windows) auch eine "Unable to open file" Exception:

Code: Alles auswählen

Unable to open file "DateiDieNichtExisitert": Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
Denn wenn unter Windows eine Datei zum Schreiben geöffnet ist kann sie nicht mal zum Lesen geöffnet werden.

Wenn man das Handle allerdings nach dem FileCreate schließt, kommt der Fehler nicht mehr:

Code: Alles auswählen

  FileClose(FileCreate('DateiDieNichtExisitert'));
  TStringList.Create.LoadFromFile('DateiDieNichtExisitert');

kmesch
Beiträge: 6
Registriert: Mi 15. Jun 2022, 17:42

Re: FileCreate

Beitrag von kmesch »

Hallo,
ich habe den Fehler jetzt gefunden, er entsteht an ganz anderer Stelle. Es handelt sich um ein Problem welches in diesem Forum vor einiger Zeit schon einmal dikutiert wurde. Eine Filelistbox lässt sich nicht aktualisieren. Der Bug scheint also immer noch zu bestehen...

kmesch
Beiträge: 6
Registriert: Mi 15. Jun 2022, 17:42

Re: FileCreate

Beitrag von kmesch »

ich habe -> FileClose(FileCreate('DateiDieNichtExisitert')); ausprobiert, funktioniert leider nicht. Die Datei wird nicht geschlossen...

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: FileCreate

Beitrag von theo »

kmesch hat geschrieben:
Fr 17. Jun 2022, 11:56
ich habe -> FileClose(FileCreate('DateiDieNichtExisitert')); ausprobiert, funktioniert leider nicht. Die Datei wird nicht geschlossen...
Warum machst du's denn so kompliziert, mit FileCreate?
Hat das einen besonderen Grund?
Habe dir oben ein Beispiel mit TStringList gemacht, wp_xyz mit TextFile.
Warum machst du's nicht so?

kmesch
Beiträge: 6
Registriert: Mi 15. Jun 2022, 17:42

Re: FileCreate

Beitrag von kmesch »

Es funktioniert... Vielen Dank für deine Geduld !

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 988
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: FileCreate

Beitrag von kralle »

Moin,
kmesch hat geschrieben:
Fr 17. Jun 2022, 15:01
Es funktioniert... Vielen Dank für deine Geduld !
Wenn es funktioniert, dann den funktionierenden Code/-teil hier posten, dann haben alle was davon.

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

kmesch
Beiträge: 6
Registriert: Mi 15. Jun 2022, 17:42

Re: FileCreate

Beitrag von kmesch »

Hallo Heiko,
was da jetzt genau passiert ist weiß ich auch nicht.

anstatt
MText.Lines.LoadFromFile(DirPath + '\' + ExtractFileNameOnly(CBt.Items.Strings[0]) + '.txt');
(Inhalt der Textdatei in ein Memofeld laden zum Bearbeiten, Resultat: Textdatei kann nicht geöffnet werden)

lautet der Code jetzt
StrL := tStringList.Create;
StrL.LoadFromFile(DirPath + '\' + ExtractFileNameOnly(CBt.Items.Strings[0]) + '.txt');
MText.Lines.LoadFromFile(DirPath + '\' + ExtractFileNameOnly(CBt.Items.Strings[0]) + '.txt');

ich habe damit den Vorschlag von theo übernommen.

Antworten