AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Datei kann nicht geschrieben werden - Warum und wie ändern?
Thema durchsuchen
Ansicht
Themen-Optionen

Datei kann nicht geschrieben werden - Warum und wie ändern?

Offene Frage von "torud"
Ein Thema von torud · begonnen am 26. Okt 2006 · letzter Beitrag vom 30. Okt 2006
Antwort Antwort
Seite 1 von 3  1 23      
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#1

Datei kann nicht geschrieben werden - Warum und wie ändern?

  Alt 26. Okt 2006, 19:46
Hallo Wissende,

ich habe ein Freeware-Tool geschrieben, welches aus TextDateien automatisiert HTML-Dateien macht. Bei mir lief auf meinen Testsystemen und auf der Entwicklungsumgebung alles super.

Nun habe ich aber von einem User eine EMail erhalten, die besagt, dass bei ihm sehr oft die Meldung kommt, dass die Datei nicht geschrieben werden kann. Wie kann ich das Abfangen, bzw. das Speichern der Datei/en doch IMMER sicherstellen?

Diese Routine ist eine von beiden, die macht was ich will:
Delphi-Quellcode:
procedure TForm1.GenerateFile(Filename:String;LoadatWeb:boolean;ArtikelNumber:integer);
var
  myList,HtmlList,list:TStringlist;
  i:integer;
  str_head,str_content:string;
begin
  myList:=TStringlist.Create;
  myList.LoadFromFile(Filename);
  ed_head.Text:=myList.Strings[0];
  str_head:=myList.Strings[0];
  myList.Delete(0);
  mem_txt.Lines.Assign(myList);

  list:=TStringList.Create;
  list.Assign(myList);
  for i:=0 to list.count-1 do
    begin
      if i<list.Count-1 then list.Strings[i]:=list.Strings[i]+ '
'
    end;
  str_content:=List.Text;

  HtmlList:=TStringlist.Create;

  HtmlList.Add('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">');
  HtmlList.Add('<html>');
  HtmlList.Add('<head>');
  HtmlList.Add('<link rel="stylesheet" href="../css/'+cmb_css_file.Text+'" type="text/css" />');

  HtmlList.Add('</head>');
  HtmlList.Add('<body>');
  HtmlList.Add('');
  HtmlList.Add('<h3>'+str_head+'</h3>');
  HtmlList.Add('');
  HtmlList.Add('

'+str_content+'</p>');
  HtmlList.Add('');
  if (LoadatWeb=false) and (complete.chk_hist_back.Checked) then
    HtmlList.Add('

[url="javascript:history.back()"]Zurück[/url]</p>
');
  HtmlList.Add('');
  HtmlList.Add('</body>');
  HtmlList.Add('</html>');
  HtmlList.SaveToFile(Pvw_Path + 'artikel_id_'+inttostr(ArtikelNumber)+'.html');
  if LoadatWeb then
    web.Navigate(Pvw_Path + 'artikel_id_'+inttostr(ArtikelNumber)+'.html');
  myList.Free;
  HtmlList.Free;
end;
Danke für Tipps. Ich will nicht nur die Fehlermeldung unterdrücken, sondern auch sicherstellen, dass das Speichern wirklich klappt. SaveToFile gibt leider keinen Wert zurück. Hat jemand einen Vorschlag?
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 19:49
Hi,

erstmal würde ich Dir empfehlen, Resourcen-Schutzblöcke (try...finally) und Einrückung zu verwenden. Dann siehst Du, ob ggf. eine Liste nicht freigeben wurde die evtl. eine Datei sperrt.
Diese Schema verwende ich:
Delphi-Quellcode:
MyList := TStringList.Create;
MySecondList := TStringList.Create;
try
  // Viel Code
finally
  MyList.Free;
  MySecondList.Free;
end;
Zu Deinem Problem: Hat der Benutzer vielleicht keine Schreibberechtung auf den Ordner, in dem er die Datei speichern möchte? Ist die Datei evtl durch ein anderes / dein Programm gesperrt?

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 19:53
Danke für Deine Antwort. Die Datei dürfte nicht durch ein anderes Programm gesperrt sein, zumindest nicht durch eines von mir. Was aber der Fall ist, ist das die Datei dann zumeist im TWebbrowser geladen wird. Aber der blockiert doch nicht das überschreiben einer schon vorhandenen Datei...

Und das mit den Schreibrechten kann nicht sein, dass es ja manchmal geht und manchmal eben nicht.

Komisch, oder?
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 19:56
Zitat von torud:
Danke für Deine Antwort. Die Datei dürfte nicht durch ein anderes Programm gesperrt sein, zumindest nicht durch eines von mir. Was aber der Fall ist, ist das die Datei dann zumeist im TWebbrowser geladen wird. Aber der blockiert doch nicht das überschreiben einer schon vorhandenen Datei...

Und das mit den Schreibrechten kann nicht sein, dass es ja manchmal geht und manchmal eben nicht.

Komisch, oder?
Ja, das ist allerdings recht seltsam.
Ich weiss jetzt nicht in wie fern der WebBrowser die Datei sperrt, während er sie liest. Vielleicht ist da ja der Hund begraben. Vielleicht kannst Du ja die Funktion schnell hintereinander mit der selben Datei testen, um das reproduzieren zu können.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 20:07
Also das Erstellen passiert, wenn man einen Doppelklick auf eine Listbox macht. Ich habe soeben mal 20 mal ganz schnell und oft drauf geklickt. Irgendwann zum Ende hin stieg der Compiler ein...

Folgender Fhlercode:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt TxtFilesToHtml.exe ist eine Exception der Klasse EFCreateError aufgetreten. Meldung: 'Datei C:\Programme\Borland\Delphi6\Projects\TxtFilesToHt ml\preview\artikel_id_1.html kann nicht erstellt werden'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 20:10
wie wäre es denn damit?
Delphi-Quellcode:
  sFileName := Pvw_Path + 'artikel_id_'+inttostr(ArtikelNumber)+'.html';

  if fileexists(sFileName) then
    DeleteFile(sFileName);

  HtmlList.SaveToFile(sFileName);
  myList.Free;
  HtmlList.Free;
  if LoadatWeb then
    web.Navigate(sFileName);
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 20:12
und noch etwas: du hast 3 stringlisten, wovon du nur 2 wieder freigibst?
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#8

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 20:16
Ok, ich werde es mal so wie von Dir beschrieben versuchen! Ich bin mir aber nicht sicher, ob der Webbrowser die geladene Datei nicht doch für belegt erklärt und das Löschen verbietet. Aber ich werde es ja sehen.

Das mit den Stringlisten ist natürlich schlampig! Auch das werde ich ändern. Danke für diesen Hinweis.

Darf ich Fragen, was Dich glauben macht, dass dieser Weg ohne die Fehlermeldung auskommt?
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 20:31
also ich wüsste nicht an welcher stelle der webbrowser die datei blockieren sollte?!
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#10

Re: Datei kann nicht geschrieben werden - Warum und wie ände

  Alt 26. Okt 2006, 21:39
Also den Code habe ich nun angepasst. Hier kommt bisher keine Fehlermeldung mehr. Ich habe mich dann auch daran gemacht den Code für die IndexPage anzupassen. Dieser sieht wie folgt aus. Ich hätte davon sicher die Masse weglassen können, aber wer weiss wozu es gut ist. Manchmal steckt der Teufel eben im Detail.

Dieser Code wird ausgeführt nach Druck auf einen Button. Es reichten mir 4 Versuche bis die Meldung kam, dass die Datei nicht erzeugt werden kann.

Delphi-Quellcode:
procedure Tcomplete.btn_generateClick(Sender: TObject);
var
  HtmlList,ContentList,FileList:TStringlist;
  str_head,str_content,sFileName:string;
  i,k,z,j,int_Count,int_cols,int_rows,int_filecounter_th,int_filecounter_td:integer;
begin
  int_Count:=0;
  int_cols:=0;
  int_rows:=0;
  int_filecounter_th:=0;
  int_filecounter_td:=0;

  int_cols:=ed_cols.Value;
  ContentList:=TStringlist.Create;
  HtmlList:=TStringlist.Create;
  FileList:=TStringlist.Create;

  HtmlList.Add('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">');
  HtmlList.Add('<html>');
  HtmlList.Add('<head>');
  HtmlList.Add('<link rel="stylesheet" href="../css/'+cmb_css_file.Text+'" type="text/css" />');

  HtmlList.Add('</head>');
  HtmlList.Add('<body>');

    for i:=0 to form1.list_files.Count-1 do
      if form1.list_files.Checked[i] then
        begin
          inc(int_Count);
          FileList.Add(form1.ed_dir.Text + form1.list_files.items[i])
        end;

    case rad_artikel_style.ItemIndex of
      0 : begin
            for i:=0 to form1.list_files.Count-1 do
              begin
                if form1.list_files.Checked[i] then
                  begin
                    ContentList.LoadFromFile(form1.ed_dir.Text + form1.list_files.Items.Strings[i]);
                    str_head:=ContentList.Strings[0];
                    ContentList.Delete(0);
                    str_content:=ContentList.Text;
                    form1.GenerateFile(form1.ed_dir.Text + form1.list_files.Items[i],false,i);
                    SetLength(str_content,strtoint(ed_sign_count.text));
                    //hier wird das layout zusammengebaut
                            HtmlList.Add('');
                            HtmlList.Add('<h3>'+str_head+'</h3>');
                            HtmlList.Add('');
                            if chk_br_linktext.Checked then
                              HtmlList.Add('

'+str_content+'
[url="artikel_id_
'+inttostr(i)+'.html"]'+ed_linktext.Text+'[/url]</p>')
                            else
                              HtmlList.Add('

'+str_content+' [url="artikel_id_'+inttostr(i)+'.html"]'+ed_linktext.Text+'[/url]</p>');
                            HtmlList.Add('');
                    end;
                  end;
              end;
        1 : begin
              HtmlList.Add('<table cellpadding="3">');
              int_rows:=((int_Count div int_cols) + (int_Count mod int_cols));
              //arbeitet alle zeilen ab
              for k:=0 to int_rows-1 do
                begin
                  //arbeitet die th-spalten ab
                  HtmlList.Add(' <tr valign="top">');
                  for z:= 1 to int_cols do
                    begin
                      ContentList.Clear;
                      if int_filecounter_th<int_Count then
                        begin
                          ContentList.LoadFromFile(FileList.Strings[int_filecounter_th]);
                          str_head:=ContentList.Strings[0];
                          HtmlList.Add(' <th>'+str_head+'</th>');
                        end
                      else
                          HtmlList.Add(' <th></th>');
                      inc(int_filecounter_th);
                    end;
                  HtmlList.Add(' </tr>');
                  //arbeitet die td-spalten ab
                  HtmlList.Add(' <tr valign="top">');
                  for z:= 1 to int_cols do
                    begin
                      ContentList.Clear;
                      if int_filecounter_td<int_Count then
                        begin
                          ContentList.LoadFromFile(FileList.Strings[int_filecounter_td]);
                          ContentList.Delete(0);
                          str_content:=ContentList.Text;
                          form1.GenerateFile(FileList.Strings[int_filecounter_td],false,int_filecounter_td);
                          SetLength(str_content,strtoint(ed_sign_count.text));
                          HtmlList.Add(' <td>' +str_content+' [url="artikel_id_'+inttostr(int_filecounter_td)+'.html"]'+ed_linktext.Text+'[/url]</td>');
                        end
                      else
                          HtmlList.Add(' <td></td>');
                      inc(int_filecounter_td);
                    end;
                  HtmlList.Add(' </tr>');
                end;
            end;
    end;
    HtmlList.Add('</body>');
    HtmlList.Add('</html>');

    sFileName := Pvw_Path + 'index.html';

    if fileexists(sFileName) then
      DeleteFile(sFileName);
      sleep(60);

    try
      HtmlList.SaveToFile(sFileName);
      web.Navigate(sFileName);
    finally
      FileList.Free;
      HtmlList.Free;
      ContentList.Free;
    end;
end;
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt TxtFilesToHtml.exe ist eine Exception der Klasse EFCreateError aufgetreten. Meldung: 'Datei C:\Programme\Borland\Delphi6\Projects\TxtFilesToHt ml\preview\index.html kann nicht erstellt werden'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
Danke
Tom
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 04:32 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