I managed to set a flag, then loop on exceptions with a "LoadFromFile)"
until there was no exception, and that seems to solve the problem!
Thanks Sid,
Rich
Sid Gudes wrote
>I haven't tried this, but probably what you can do is try to open the
> file exclusively (fmShareExclusive). If it is in use by DOS, then
> the open should fail. Once DOS finishes and closes the file, the
> open should succeed. So something like this:
>
> waiting := 100;
> repeat
> try
> fs := tFileStream.create (D+'harbor.txt', fmOpenRead or
> fmShareExclusive);
> // at this point the open succeeded, so break out of the loop
> fs.destroy;
> break;
> except
> // we get here if the file was not openable, or does not exist
> sleep (100);
> end;
> dec (waiting);
> until waiting <= 0;
> if waiting <= 0 then error...
>
> The above is OTTOMH. I think also, in case there is an old version
> of harbor.txt on the hard drive, that it would make sense to delete
> the file before running the DOS command, otherwise the
> tFileStream.create might just succeed on the old file before the DOS
> session gets underway.
>
> BTW, should
> '/c '+'ipconfig/all > harbor.txt'
>
> be instead
> '/c '+'ipconfig/all > ' + D + 'harbor.txt'
> ?
>
> HTH
>
>
> At 09:07 AM 7/6/2006, Rich Cooper wrote:
>>Thanks Rob,
>>
>>But actually, I did get one to work. It finally gelled for the following
>>code 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 MOST of the time. But occasionally, (5%) it causes
>>an exception related to trying to read a file that is still being written.
>>
>>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.
>>
>>Thanks,
>>Rich
>>
>>
>>Rob Kennedy wrote
>>
>> > Rich Cooper wrote:
>> >> I'm trying to pipe a DOS command to a file using a ShellExecute,
>> >> but it doesn't create the output file. Here's the code:
>> >>
>> >> var D : string;
>> >> ...
>> >> D := GetStartDir;
>> >> ShellExecute(0,pChar('ipconfig/all >
>> >> '),pchar('harbor.txt'),nil,pChar(D),SW_SHOWNORMAL);
>> >> ...
>> >>
>> >> but no file named 'harbor.txt' gets created. Does anyone know how to
>> >> fix this?
>> >
>> > First, "ipconfig/all >" is not a shell verb. Did you read the
>> > documentation for ShellExecute before composing the code above?
>> >
>> > Second, you're telling ShellExecute to look in the registry for the
>> > "ipconfig/all >" key for files named *.txt, and then execute the
>> > command
>> > it finds there on the harbor.txt file, which I'm guessing doesn't even
>> > exist.
>> >
>> > Third, note that command-line redirection is performed by the
>> > command-line interpreter. ShellExecute is not a command-line
>> > interpreter. Read this:
>> >
>> > http://blogs.msdn.com/oldnewthing/archive/2006/05/16/598893.aspx
>> >
>> > You should be able to find lots of example code to solve your problem
>> > with the following search:
>> >
>> > http://groups.google.com/groups?q=pipe+dos+command&as_ugroup=*delphi*
>> >
>> > Fourth, ipconfig is not a DOS command. It's a console program, but it's
>> > a fully fledged Windows program. Try to run it in DOS (if you even have
>> > a computer with DOS installed anymore), and you'll simply be told that
>> > it needs to run in Win32 mode.
>> >
>> > Finally, type-casting a string literal to PChar is not necessary and
>> > can
>> > sometimes lead to problems. A string literal can be used as any
>> > string-related type, including AnsiString, WideString, PAnsiChar, and
>> > PWideChar. The compiler will choose based on what it needs. You don't
>> > need to tell it.
>> > --
>> > Rob
>
> Regards,
> Sid Gudes
> PIA Systems Corporation
> [EMAIL PROTECTED]
_______________________________________________
Delphi mailing list -> [email protected]
http://www.elists.org/mailman/listinfo/delphi