Avatar billede fun22 Nybegynder
08. januar 2004 - 13:58 Der er 8 kommentarer og
1 løsning

Slette fil giver problemer

Hej

Jeg har denne kode til at slette en fil med:

DeleteFile(extractFilePath(ParamStr(0))+'indbox\'+maillist.Selected.SubItems.Strings[0]+'.msg');

Men jeg får en acces violation hver gang jeg køre koden, og kan ikke begribe hvad der er galt.
Avatar billede snowball Novice
08. januar 2004 - 14:04 #1
Prøv evt. med nedenstående for måske at få en bedre fejlbeskrivelse:

try
  DeleteFile(extractFilePath(ParamStr(0))+'indbox\'+maillist.Selected.SubItems.Strings[0]+'.msg');
except
  ShowMessage(SysErrorMessage(GetlastError));
end;

Prøv evt. også at skrive "extractFilePath(ParamStr(0))+'indbox\'+maillist.Selected.SubItems.Strings[0]+'.msg'" ud for at se om strengen er som den skal være.

Snowball
Avatar billede doc404 Novice
08. januar 2004 - 18:52 #2
Den eneste der kan give en exception i det tilfælde, er enten at Selected er nil eller du rent faktisk ikke har noget i substrings.

I øvrigt skal du lige checke om ExtractFilePath inkluderer den sidste '\' (kan ikke huske det)..
Avatar billede delphimaniac Nybegynder
11. januar 2004 - 13:07 #3
Det lyder for mig som om du har åbnet filen andetsteds og derfor ikke kan slette den. Den fejl begår jeg ofte hvor jeg ikke får lukket filen ordentligt.
Avatar billede hrc Mester
11. januar 2004 - 15:42 #4
Mht. doc404 så findes der en funktion til at kontrollere om den slutter med et backslash: fn := IncludeTrailingBackslash(fn);

Prøv at køre snowballs eksempel (og prøv at gemme filnavnet i en streng) - så finder du sikkert fejlen:

var
  st : string;
begin
  assert(assigned(maillist.Selected),'Not assigned'); // Brokker sig hvis nil
  try
    st := extractFilePath(ParamStr(0))+
          'indbox\'+maillist.Selected.SubItems.Strings[0]+'.msg';
    DeleteFile(st);
  except
    on e: exception do
      MessageDlg(e.Message+#13#10+st,mtErrror,[nbOK],0);
  end; // try
end;
Avatar billede fun22 Nybegynder
15. februar 2004 - 16:37 #5
delphimaniac >> hvordan får jeg så lukket filen uden at lukke mit program?
Avatar billede delphimaniac Nybegynder
15. februar 2004 - 16:51 #6
Tja så skal du sørge for at du i dit program altid lukker en fil efter brug. Det lyder lidt simpelt, men det er det jeg glemmer ind imellem :(
Avatar billede hrc Mester
15. februar 2004 - 19:09 #7
Det er noget med altid at pakke koden ind i try-finally'er:

ÅbenFil
try
  GørEtEllerAndet
finally
  LukFil
end
Avatar billede fun22 Nybegynder
15. februar 2004 - 20:35 #8
hrc, hvad er koden til lukning af fil?
Avatar billede hrc Mester
15. februar 2004 - 21:34 #9
Øhhh?

var
  st : string;
  fp : textfile;
begin
  if not FileExists('test.txt') then
    exit;

  assignfile(fp,'test.txt');
  reset(fp);
  try
    while not eof(fp) do begin
      readln(fp,st);
      Memo1.Lines.Add(st);
    end; // while
  finally
    closefile(fp);
  end;
end;

Ved at placere den i en try-finally så sikrer du, at filen bliver lukket uanset hvordan behandlingen gik.

En anden måde at sikre at filerne lukkes ordentligt, er ved at bruge streams hvor det kan lade sig gøre. En stream er normalt en binær fil, men den største forskel er, at det er et objekt hvor ovenstående er noget "gammelt" noget.

Tilsvarende kode ville se nogenlunde sådan ud:

var
  fs : TFileStream;
  buffer : pchar;
begin
  getmem(buffer,1024);
  fs := TFileStream.Create('test.dat',fmOpenRead);
  try
    while fs.position < fs.size do begin
      fs.read(buffer^,sizeof(buffer));
      // Behandl buffer her
    end; // while
  finally
    fs.Free;
    freemem(buffer);
  end;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester