Rich Cooper wrote:
> Thanks Stephen,
> 
> I found a web page with a similar snippet, and so I was able to
> get the following to work in my OnFormCreate handler:
> 
> 
>   D := GetStartDir;
>   ShellExecute( 0, 'open', PChar('command.com'),
>                 PChar('/c '+'ipconfig/all > harbor.txt'),
>                 nil, SW_HIDE );
>   Waiting := 100;
>   while ( (Waiting>0) and (not FileExists(D+'HARBOR.TXT')))
>   do begin
>         Sleep(250);
>         Waiting := Waiting-1;
>      end;
> 
>   if   (not FileExists(D+'HARBOR.TXT'))
>   then raise Exception.Create('Login Error 1.');
> 
> But there is still a problem.  The 'Waiting' loop discovers that the
> file exists, but not whether it has been completely written and let
> loose to be read.  In my OnFormActivate handler, I use:
> 
>    if   FirstActivation
>    then begin
>           D := GetStartDir;
>           Application.ProcessMessages;
>           Sleep(500);
> 
>           if   FileExists(D+'HARBOR.TXT')
>           then begin
>                   meHarbor.Lines.LoadFromFile(D+'HARBOR.TXT');
> 
> 
> which works 95% of the time.  But sometimes it causes the LoadFromFile
> procedure to throw an exception related to trying to read a file that is
> not yet ready to be read - still locked by the NT file system in XP, and not
> yet completely written to the HARBOR.TXT file and then released to
> the rest of the computer.
> 
> Does anyone have a way to determine whether the file HARBOR.TXT
> has been released for reading after being completely written?  I would
> be able to fix this problem by replacing the Sleep(500) with a loop
> that tests till the HARBOR.TXT file is ready for reading, having been
> fully released.

I don't know precisely how cmd.exe creates and opens a redirected file 
like that, but your attempting to open it in "exclusive share" mode 
ought to fail regardless if the file is still being written.

You can use a TFileStream instance, like so:

   FS := TFileStream.Create(D + 'HARBOR.TXT',
    fmOpenRead or fmShareExclusive);

Attempt that and catch any exception raised due to the sharing conflict 
(should be some form of EInOutError), if the file exists and no 
exception is raised on attempting to open it, then it should be finished.

HTH

Stephen Posey
[EMAIL PROTECTED]

_______________________________________________
Delphi mailing list -> Delphi@elists.org
http://www.elists.org/mailman/listinfo/delphi

Reply via email to