AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rewrite I/O-Error 'Ungültiger Dateiname

Ein Thema von eshart · begonnen am 5. Mai 2016 · letzter Beitrag vom 6. Mai 2016
Antwort Antwort
Seite 1 von 2  1 2      
eshart

Registriert seit: 5. Mai 2016
5 Beiträge
 
#1

Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 5. Mai 2016, 22:57
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:
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;
Das Formular bekommt hier den Variableninhalt von dem Record und dem dynamischen zweidimensionalen Array aus Tabellenliste übergeben und soll damit weiterarbeiten


Der Code von dem Formular rechts "Tabellenliste"

Delphi-Quellcode:
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.
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).

Und schlussendlich noch der Code zum Erstellen der Tabelle aus Formular "Erstelle_Tabelle"
Delphi-Quellcode:
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;
Hier tritt der anscheinende Fehler bei rewrite(textdatei) auf, der eigentlich gar kein Fehler ist, da syntaktisch alles stimmt.


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
Miniaturansicht angehängter Grafiken
ansicht.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 5. Mai 2016, 23:19
Eine relative Pfadangabe 'table_data\' + ist gefährlich. Von wo ist der Pfad relativ? Das kann alles mögliche sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
eshart

Registriert seit: 5. Mai 2016
5 Beiträge
 
#3

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 5. Mai 2016, 23:29
Eine relative Pfadangabe 'table_data\' + ist gefährlich. Von wo ist der Pfad relativ? Das kann alles mögliche sein.
Wieso ist sie gefährlich?
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?
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#4

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 5. Mai 2016, 23:47
Der Ordner selbst befindet sich im Projektorder.
Das mag sein. Aber eine relative Pfadangabe arbeitet immer in irgendeinem Verzeichnis, normalerweise dem Arbeitsverzeichnis. Wo ist das? Dort, wohin man mit SetCurrentDir gesetzt hat. Das passiert z.B. beim Benutzen von Öffnen-/Speichern-Dialogen, aber auch in den Eigenschaften von Verknüpfungen kann man solche Angaben finden.

Zitat:
Da der Projektordner auf unterschiedlichen Laufwerken und in unterschiedlichen Ordnerstrukturen abgespeichert wird/werden kann muss der Pfad doch relativ und nicht absolut sein, oder?
Nein. Bau dir den absoluten Pfad mithilfe von Variablen zusammen, die das beinhalten, was du brauchst. Soll es relativ zum Programm selbst sein, bietet sich sowas an (delphi-haltiger Pseudo-Code):
Code:
ExtractFilePath(ParamStr(0)) + 'table_data\' + ...
MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 6. Mai 2016, 00:22
Soll es relativ zum Programm selbst sein, bietet sich sowas an (delphi-haltiger Pseudo-Code):
Code:
ExtractFilePath(ParamStr(0)) + 'table_data\' + ...
Was aber auch keine gute Idee ist, sollte der Admin, wie es sich gehört, in das Programmverzeichnis von Windows zu kopieren, denn da hat der normale Benutzer keine Schreibrechte.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#6

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 6. Mai 2016, 01:42
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
  Mit Zitat antworten Zitat
eshart

Registriert seit: 5. Mai 2016
5 Beiträge
 
#7

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 6. Mai 2016, 02:23
Habe es abgeändert.
Code:
AssignFile(textdatei, ExtractFilePath(ParamStr(0)) + 'table_data\' + name_text);
Danke, werde ich mir für die Zukunft merken.

Trotzdem bleibt der I/O-Error. :/
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 6. Mai 2016, 03:03
Pack das
Code:
ExtractFilePath(ParamStr(0)) + 'table_data\' + name_text
mal in eine Variable und lass sie dir anzeigen. Steht da wirklich das drin, was drin stehen soll?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
eshart

Registriert seit: 5. Mai 2016
5 Beiträge
 
#9

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 6. Mai 2016, 03:15
Es wird genau das angezeigt was angezeigt werden soll.
Miniaturansicht angehängter Grafiken
anzeige.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Rewrite I/O-Error 'Ungültiger Dateiname

  Alt 6. Mai 2016, 03:36
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:
https://stackoverflow.com/questions/...-under-windows
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr.
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