2017-01-19 3 views
-3

Ich brauche eine Datei mit dem Dateinamen zu schreiben, das aktuelle Datum enthält .. alles außer dem Tag arbeitet, gibt es eine Klasse Ausnahme ‚Lauffehler (3)‘lazarus/pascal Schreibdateinamen mit dem aktuellen Datum

(die importo.text ist der Text eines TEdit .. aber ich denke, es ist irrelevant ist)

uses 
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; 

... 

var 
    contributo:real; 
    f:textfile; 
... 
    datee: string; 

... 

contributo:= (StrToInt(importo.text)/ 100)*4; 

    datee:= DateToStr(Date); 

    assignfile(f,'fattura minimi n.'+n.text+' '+datee+'.txt'); 
    rewrite(f); 

    writeln(f,'Giovanna Migliore'); 
    ... 

    closefile(f); 
+4

Führen Sie ein Debugging durch. Was ist der Wert der Zeichenfolge, die Sie als Dateiname verwenden? –

+0

RTE 3 ist Pfad nicht gefunden. Backslashes in n.text oder datee? Wie David vorschlägt, überprüfen Sie, ob der Dateiname korrekt ist. –

Antwort

6

DateToStr() das Datum zurück zur regionalen Einstellungen entsprechend formatiert. In Ihrem Fall wird fast sicher ein Ordner-/Pfadbegrenzungszeichen (/ oder \) zurückgegeben, das das Problem verursacht (Pfad nicht gefunden).

Auch wenn Sie Ihre regionalen Einstellungen ändern, um die Verwendung solcher Zeichen zu vermeiden, wird der Code auf anderen Systemen weiterhin fehlschlagen, wenn diese regionalen Einstellungen nicht "kompatibel" sind. Um dies zu vermeiden, müssen Sie sicherstellen, dass die Kodierung des Datums im Dateinamen für diese potenziellen Probleme nicht anfällig ist.

Sie könnten entfernen/ersetzen alle diese Zeichen nach den Dateinamen bilden, oder Sie können explizit das Datum in einer Weise kodieren, die solche Zeichen nicht mit ähnlich zu beginnen vorstellen:

var 
    y, m, d: Word; 

.. 

    DecodeDate(Date, y, m, d); 
    dateStr := Format('%4d-%2d-%2d', [y, m, d]); 

    // e.g. dateStr value for 31st Dec 2016 would be: '2016-12-31' 

Sie könnten dann Integrieren Sie die Werte der Datumskomponente in Ihren Dateinamen entweder durch Verkettung nach Bedarf oder direkt in einer einzigen Formatanweisung:

+1

Diese Art von Frage und Antwort macht mich entmutigt über diese Seite. Ich denke, wir haben es alle schon so oft gesehen und erkennen sofort das Problem. Abgesehen vom Fragesteller. Was der Fragesteller wirklich braucht, sind Debugging-Fähigkeiten. Fragen hier zu stellen, die schon so oft gestellt wurden, ist ein schlechter Ersatz für das Debuggen. Wie können wir diesen Menschen das Fischen beibringen? –

+2

Sie können 'FormatDateTime()' anstelle von 'DecodeDate()' und 'Format()' separat verwenden: 'dateStr: = FormatDateTime ('yyyy" - "mm" - "dd', Datum);' und sogar etwas so: 'filename: = FormatDatumZeit ('" fattura minimi n.' + n.text + '"jjjj" - "mm" - "dd" .txt "', Datum);' –

+2

@David - du kannst nicht Lehre * irgendjemand * * irgendetwas * wenn sie nicht lernen wollen und du deine Zeit damit verschwendest zu versuchen. Beachten Sie, dass diese Antwort nicht nur eine Lösung für das vorliegende Problem bietet. Es erklärt, warum es ein Problem und die Gründe für die Lösung gibt. Auf der A ** Q + A ** Seite geht es darum, hilfreiche * Antworten * zu geben, die Menschen helfen, zu lernen, und nicht, dass sie Leute packen, nur weil sie noch nicht die Fähigkeiten haben, die der Rest von uns genießt. Jemandem zu helfen, Fisch zu lernen, muss nicht bedeuten, dass er sich in der Zwischenzeit weigert, mit seinem unmittelbaren Hunger zu helfen. – Deltics

Verwandte Themen