Newsgroup: it.comp.lang.delphi
Titolo: Testare l'esistenza di un file

Ciao a tutti.
Sto cercando di utilizzare un componente TTextdataset per il quale non è
prevista l'opzione
exists. C'e un altro metodo per sapere se un file esiste già?
 
Grazie Ilenia
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 exists. C'e un altro metodo per sapere se un file esiste già?
Non conosco il componente a cui fai riferimento, ma la unit /SysUtils/ 
mette a disposizione la routine *FileExists* che restituisce il valore 
booleano True se esiste il file di cui viene specificato il percorso 
completo come parametro.
Ciao! :-)
-- 
MARCO «Alka» BREVEGLIERI
   (
http://www.marco.breveglieri.name
)
Leggi le FAQ di ICLD: 
http://icld.altervista.org

Salve ragazzi, ho questo problema che mi affligge da un paio di giorni. 
La seguente proc provvede a creare un file bat che lancio regolarmente 
per leggere in un database la presenza di un determinato record, fino a 
qui tutto ok, la riga successiva al lancio del suddetto file esegue la 
lettura del record creato all'interno del file txt, arrivato a questo 
punto la proc si blocca con il msg 'File Non Trovato', ho utilizzato un 
ciclo 'For' per ritardare l'esecuzione del la proc ma niente, ho 
utilizzato il FileExist all'interno di un 'Repeat Until' niente, ho 
lanciato un exe a parte niente,ho provato a leggerlo in un'altra proc 
niente sempre lo stesso 'File Non Trovato', Sig :((, aiutatemi per 
favore, vi ringrazio anticipatamente.
Procedure TForm1.Button1Click(Sender: TObject);
Var
F,FBP:TextFile;
S,sd,m,Ean,Des,Prz:String;
P,I:LongInt;
Flag:Boolean;
begin
//AssignFile(FBP,'C:\BRAINPOS\RUN\BF_EXPBP.TXT' );
AssignFile(F,'c:\brainpos\run\BF_EXPBP.BAT');
Rewrite(F);
//Rewrite(FBP);
//Writeln(fbp,'x');
//closefile(FBP);
//   edredean.text:=clientsocket1.Socket.ReceiveText;
//s:=edredean.text;
s:='';
S:=Copy(edredean.text,1,Length(edredean.text)-1);
m:=s;
    if Copy(s,1,7) > '29999999' then
       Begin
         Label3.Caption:=S;
         writeln(F,'CD '+V[1]);
         writeln(F,'IES /C12 /IP /K'+m+' /FBF_EXPBP.TXT');
         CloseFile(F);
         ShellExecute
(Handle,nil,'c:\brainpos\run\BF_EXPBP.BAT',nil,nil,SW_Minimize);
       // Winexec('c:\brainpos\run\BF_EXPBP.BAT',sw_minimize);
       end;
      flag:=false;
      repeat
        if FileExists('C:\BRAINPOS\RUN\BF_EXPBP.TXT') then
           flag:=True;
      until flag=true;
For i:=0 to 200000 do 
begin
flag:=false;
end;
{ Qui si blocca la proc con il messaggio 'File Non Trovato'.
        Begin
       AssignFile(FBP,'C:\BRAINPOS\RUN\BF_EXPBP.TXT' );
       Reset(Fbp);
       Readln(FBP,S);
       CloseFile(FBP);
       End;
        (*      for i:=0 to length(s) do
        begin
          P := Pos('!', S);
          ListBox1.Items.Add(IntToStr(P));
//          Ean := Copy(S, 1, P - 1);
          Delete(S, 1, P);
        end;  *)
    ClientSocket1.Socket.SendText (chr(27)+chr(37));
end;
--- posted by geoForum on 
http://www.delphiedintorni.it

 punto la proc si blocca con il msg 'File Non Trovato',
in casi simili io cerco di depurare il codice da tutte le parti superflue 
oltre a quella che penso mi crei il problema.
Nel tuo caso avrei scritto qualcosa tipo
const
  FILE_NAME = 'c:\brainpos\run\BF_EXPBP.BAT';
var
  F: TextFile;
begin
  AssignFile(F, FILE_NAME);
  try
    Rewrite(F);
    if not FileExists(FILE_NAME) then
      raise Exception.CreateFmt('Il file "%s" non esiste', [FILE_NAME]);
//o anche Assert(FileExists(FILE_NAME)) ;
  finally
    CloseFile(F)
  end;
che "deve" funzionare.
Poi pian piano aggiungerei le altre parti controllando passo-passo, fino a 
trovare un punto in cui scopro l'errore.
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

[...]
Prova a non dare il percorso completo del file a
ShellExecute ma a cambiare la directory corrente prima
del ShellExecute e a dare solo il nome del file .bat
ChDir('c:\brainpos\run');
ShellExecute(Handle,nil,'BF_EXPBP.BAT',nil,nil,SW_Minimize);
Non conoscendo lo script che hai messo nel file .bat ed
essendo tale script costruito con parti non presenti
nel codice da te inviato, ho preferito non provare
direttamente il tuo codice ;) ... sai com'è devo
prendere delle precauzioni :P
	Ciao
	MassimoB
 
---------------------------------
http://www.massimobeschi.it/
---------------------------------
Se tu pagare come dici tu ...
Io lavorare come dico io ...
Se tu pagare come dico io ...
Io lavorare come dici tu ...
---------------------------------

del ShellExecute e a dare solo il nome del file .bat
allora ... scordati il consiglio che ti ho dato ... :P
è una cavolata e me lo dico da solo ...
il problema è lo ShellExecute che non è sincrono,
infatti questo codice da me va
procedure TForm1.Button1Click(Sender: TObject);
var
F:TextFile;
S:String;
Text: TStrings;
begin
  try
    AssignFile(F,'prova.BAT');
    Rewrite(F);
    writeln(
      F,
      'Echo Ciao > "'
      +ExtractFilePath(Application.ExeName)
      +'prova.TXT"');
    CloseFile(F);
    ShellExecute(
      Handle,
      nil,
      Pchar('prova.BAT'),
      nil,
      nil,
      SW_NORMAL
    );
    while Not FileExists('prova.TXT') do
      Sleep(1);
    //DosCommand1.CommandLine :=
    //  '"'+ExtractFilePath(Application.ExeName)
    //  +'prova.BAT"';
    //DosCommand1.Execute2;
  finally
    DeleteFile('prova.BAT');
  end;
  try
    AssignFile(F,'prova.TXT');
    Reset(F);
    Readln(F,S);
    CloseFile(F);
  finally
    DeleteFile('prova.TXT');
  end;
  ShowMessage(S);
end;
ovviamente se nel while si mettesse una condizione di
uscita con timeout il tutto sarebbe più sicuro ed
esente da blocco dell'appicazione, nel caso
l'esecuzione del .bat non vada a buon fine e no ti
crei mai il file di testo voluto dal while.
In alternativa ti consigliere di utilizzare un metodo
meno dannoso e approssimativo per attendere
l'esecuzione del file bat come nel codice che segue.
function ShellExecuteOpenWait(
  const FileName: String): Integer;
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
  ExecuteFile: string;
begin
  ExecuteFile:= FileName;
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(ExecuteFile);
    lpVerb := PChar('Open');
    lpParameters := nil;
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@SEInfo) then begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
  end;
  Result := ExitCode;
end;
adattalo alle tue esigenze (es. SW_SHOWNORMAL in
SW_SHOWMINIMIZE)
Oppure puoi utilizzare un componentino che trovi su
torry che si chiama DosCommand
http://www.torry.net/vcl/system/tasks/doscommand.zip
che mediante la proprietà CommandLine ed il metodo di
esecuzione sincrona Execute2 esegue un comando Dos in
maniera, appunto, sincrona. Nel codice di prova, sopra
scritto, vedi in commento le line di codice che ti
serve aggiungere per utilizzare tale componente, al
posto di ShellExecute, dopo che lo hai posizionato,
come al solito, sul form.
In più tale componente ha dei metodi che ti permettono
di avere l'output della console e sapere se è stata
termina, in maniera da sapere (con un pò di ricerche e
parsing dello standard output) se l'esecuzione del bat
è andata abuon fine o no e se non è andata a buon fine
che errore ha dato.
Ciao MassimoB
P.S.: vista l'ora tarda chiedo venia per possibili
errori di ortografia, sintassi e codice ma non ho le
forze di rileggere il post e domani non ne avrò
l'opportunità quindi penso sia meglio che posti ora :P
