![]() |
Rewrite I/O-Error 'Ungültiger Dateiname
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend und frohen Männertag allen zusammen.
Das ist das erste Mal, dass ich ein Forum dieser Art schreibe, da ich normal alle meine Probleme selber löse oder schon jemand anderes einen Lösungsansatz in einem dieser Foren hat. Zur Übersicht: Ich schreibe für meine Abschlussarbeit im Abitur ein Programm, welches Lehrern zum Erstellen von Tabellen (u.a. Sportveranstaltungen, etc.) dienen soll, was auch später noch mit dem Internet zusammenarbeitet und momentan aber nur lokal funktionieren muss für die Zwischenpräsentation. Gestern bin ich mit dem Rohaufbau fertig geworden (ich nutze, da ich die meiste Zeit nicht zuhause bin, Ubuntu) und wollte es heute unter Windows das Programm nochmal testen. Da ist mir ein Fehler aufgefallen, der unter Ubuntu 16.04 LTS gar nicht auftritt. Und zwar wird mir ein I/O-Error angezeigt mit der Meldung "Ungültiger Dateiname". Das Programm sieht wie in ansicht.jpg aus. Im rechten Formular werden die verfügbaren Dateien aufgelistet (momentan keine) und mit einem Doppelklick wird auf dem Formular in der Mitte entsprechend alle Daten aus der entsprechenden Textdatei ausgelesen und angezeigt. Erstellt werden die Tabellen in einem Extraformular mit Namen "Tabelle_Erstellen". Zur Randinfo: das Formular in der Mitte und rechts im Bild werden beim Einloggen sofort gleichzeitig angezeigt. Code von dem Formular in der Mitte "Verwaltung_Lehrer". (Ich lasse das raus, was eigentlich nicht von Belangen ist)
Delphi-Quellcode:
Das Formular bekommt hier den Variableninhalt von dem Record und dem dynamischen zweidimensionalen Array aus Tabellenliste übergeben und soll damit weiterarbeiten
unit Verwaltung_Lehrer;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, Grids, Tabellenliste, StdCtrls; var Verwaltung: TVerwaltung; Grid: TStringGrid; Daten: TTabellendaten; Tabelleninhalt: TTabelle; Tabellendaten: TTabellendaten; Spalten, Zeilen: integer; implementation uses Veranstaltung_Schueler, Einloggen, Erstelle_Tabelle; {$R *.dfm} procedure TVerwaltung.FormActivate(Sender: TObject); var i, k: integer; begin { record Name : string; Datumvon : string[10]; Datumbis : string[10]; Spalte : string; Zeile : string; Information : string; end;} Tabelleninhalt:= Tabellenliste.FTabellenliste.Tabelle; //Wert aus der Unit Tabellenliste übergeben Tabellendaten:= Tabellenliste.FTabellenliste.Daten; LName.Caption:= Tabellendaten.Name; LDatum.Caption:= ('Von: ' + Tabellendaten.Datumvon + '. Bis: ' + Tabellendaten.Datumbis); MInformationstext.Clear; MInformationstext.Lines.Add(Tabellendaten.Information); VAL(Tabellendaten.Zeile,Zeilen,Fehler); VAL(Tabellendaten.Spalte,Spalten,Fehler); if (Tabellendaten.Zeile <> '') AND (Tabellendaten.Spalte <> '') then begin SGTabelle.ColCount := Spalten + 1; SGTabelle.RowCount := Zeilen + 1; for i:= 0 to Zeilen do for k:= 0 to Spalten do begin SGTabelle.Cells[k, i] := Tabelleninhalt[i,k]; end; end end; Der Code von dem Formular rechts "Tabellenliste"
Delphi-Quellcode:
Hier wird entsprechend alles aus den Dateien nach dem Doppelklick ausgelesen und in das Record und das Array "eingeschrieben" (mir fällt gerade kein besseres Wort dafür ein).
unit Tabellenliste;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TTabellendaten = record Name : string; Datumvon : string[10]; Datumbis : string[10]; Spalte : string; Zeile : string; Information : string; end; TTabelle = array of array of string; . . . private { Private-Deklarationen } public { Public-Deklarationen } Tabelle : TTabelle; Daten: TTabellendaten; end; var FTabellenliste: TFTabellenliste; implementation {$R *.dfm} procedure TFTabellenliste.FormActivate(Sender: TObject); var Filetxt: TSearchRec; //Record mit allen Informationen zur Datei begin LBTabellenListe.Items.Clear; {TSearchRec = record Time: Integer; Size: Integer; Attr: Integer; Name: TFileName; ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData; end;} if FindFirst('table_data\' + '*.txt', faAnyFile, Filetxt) = 0 //gibt 0 zurück, wenn gefunden; wenn nicht dann negativer Wert then begin repeat LBTabellenliste.Items.Add(Filetxt.Name); until FindNext(Filetxt) <> 0; //gibt ebenfalls 0 zurück, wenn gefunden FindClose(Filetxt); end else showmessage('Keine Tabellen vorhanden!'); end; procedure TFTabellenliste.LBTabellenlisteDblClick(Sender: TObject); var textdatei: TextFile; var k, i, j: integer; var Zeilen, Spalten, Fehler, Position: integer; var hilf: string; begin {record Name : string; Datumvon : string[10]; Datumbis : string[10]; Spalte : string[30]; Zeile : string; Information : string; end;} i:= LBTabellenListe.ItemIndex; AssignFile(textdatei, 'table_data\' + LBTabellenliste.Items[i]); Reset(textdatei); //Zeile für Zeile aus organisierter txt lesen with Daten do begin readln(textdatei, Name); readln(textdatei, Datumvon); readln(textdatei, Datumbis); readln(textdatei, Spalte); readln(textdatei, Zeile); readln(textdatei, Information); end; VAL(Daten.Zeile,Zeilen,Fehler); VAL(Daten.Spalte,Spalten,Fehler); // Tabelle: array of array of string; setLength(Tabelle, Zeilen + 1, Spalten + 1); //Tabelle((Zeilen), (Zeilen), ..) repeat for k:= 0 to Zeilen do begin j:= 0; readln(textdatei, hilf); repeat Position:= pos('|', hilf); if Position <> 0 then begin Tabelle[k, j]:= Copy(hilf, 1, Position - 1); delete(hilf, 1, Position); j:= j + 1; end else until Position = 0; end until EoF(textdatei); closefile(textdatei); end; end. Und schlussendlich noch der Code zum Erstellen der Tabelle aus Formular "Erstelle_Tabelle"
Delphi-Quellcode:
Hier tritt der anscheinende Fehler bei rewrite(textdatei) auf, der eigentlich gar kein Fehler ist, da syntaktisch alles stimmt.
unit Erstelle_Tabelle;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, Grids; var Erstelle: TErstelle; spalte, zeile, datumvon, datumbis, name_table, information, spaltenkopf, zeilenkopf: string; spaltenanz, zeilenanz, fehler: integer; implementation {$R *.dfm} procedure TErstelle.BErstellenClick(Sender: TObject); var textdatei : TextFile; var name_text: string; var i, k: integer; begin //spalte, zeile, datumvon, datumbis, name_table name_table:= EName_Tabelle.Text; datumvon:= EDatum_Von.Text; datumbis:= EDatum_Bis.Text; spalte:= CBAnzahlSpalten.Text; zeile:= CBAnzahlZeilen.Text; information:= MInformationstext.Lines.Text; name_text:= name_table + '_' + datumvon + '_' + datumbis + '.txt' ; AssignFile(textdatei,'table_data\' + name_text); Rewrite(textdatei); write(textdatei, name_table + #13#10 + datumvon + #13#10 + datumbis + #13#10 + spalte + #13#10 + zeile + #13#10 + information + #13#10); for i:= 0 to SGTabelle.RowCount - 1 do //von i = 0 bis Ende Zeile - 1 for k:= 0 to SGTabelle.ColCount - 1 do //von k = 0 bis Ende Spalte - 1 begin write(textdatei, SGTabelle.Cells[k, i] + '|'); //Schreibe in Zeile if (k = SGTabelle.ColCount - 1) //Wenn k = Endwert der Spalten dann Zeilenumbruch then write(textdatei, #13#10); //Zeilenumbruch erfolgt end; closefile(textdatei); showmessage('Erfolgreich!'); end; Ich wäre sehr froh darüber, wenn mir jemand bei dem Problem zu einer Lösung verhelfen könnte, da ich momentan absolut nicht weiter weiß. Programmdateien kann ich in einer .zip noch anhängen, falls gewünscht. Mit freundlichen Grüßen :) |
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Eine relative Pfadangabe 'table_data\' + ist gefährlich. Von wo ist der Pfad relativ? Das kann alles mögliche sein.
|
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Zitat:
Und was meinst du "von wo"? Der Ordner selbst befindet sich im Projektorder. Da der Projektordner auf unterschiedlichen Laufwerken und in unterschiedlichen Ordnerstrukturen abgespeichert wird/werden kann muss der Pfad doch relativ und nicht absolut sein, oder? |
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Zitat:
Zitat:
Code:
MfG Dalai
ExtractFilePath(ParamStr(0)) + 'table_data\' + ...
|
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Zitat:
|
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Da hast du recht. Mir ging's erstmal nur um das Zusammenbauen eines absoluten Pfads mittels Variablen. Ich wollte den OP vorerst nicht mit Funktionen wie ShGetSpecialFolderLocation & Co überfordern. Die Screenshots im OP zeigen jedenfalls ein Programm ohne Themes, daher ohne Manifest - daraus (und aus der Verbindung mit der Schule) schlussfolgere ich irgendwas in Richtung Delphi 7, wo man diese Funktionen erst noch deklarieren müsste.
MfG Dalai |
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Habe es abgeändert.
Code:
Danke, werde ich mir für die Zukunft merken. :)
AssignFile(textdatei, ExtractFilePath(ParamStr(0)) + 'table_data\' + name_text);
Trotzdem bleibt der I/O-Error. :/ |
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Pack das
Code:
mal in eine Variable und lass sie dir anzeigen. Steht da wirklich das drin, was drin stehen soll?
ExtractFilePath(ParamStr(0)) + 'table_data\' + name_text
|
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Liste der Anhänge anzeigen (Anzahl: 1)
Es wird genau das angezeigt was angezeigt werden soll.
|
AW: Rewrite I/O-Error 'Ungültiger Dateiname
Kommt Windows eventuell mit den Slashes nicht zurecht im hinteren Teil des Pfades? Weil, normalerweise nutzt Windows den Backslash als Pfadtrenner. Windows kann zwar wohl beides, aber verlassen würde ich mich nicht drauf. Wer weiß, welche API den Slash nicht akzeptiert? Also noch mal ein StringReplace auf den Pfad anwenden bevor er verwendet wird.
Siehe auch: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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 by Thomas Breitkreuz