Mirror

How to wait for a file to be created (Views: 300)


Problem/Question/Abstract:

Does anyone have code that will wait for a file to be created? In particular I'm trying to come up with code that has pretty much a 0% processor usage.

Answer:

The following function consumes very litte CPU while waiting for a file to be created:

function WaitForFile(FileName: string): Boolean;
{Wait for a file to be created. Tracks the directory were the file will be created.
Returns true if file exists, false on error.}
var
  WaitHandle: THandle;
begin
  Result := False; {Let's assume we failed}
  WaitHandle := FindFirstChangeNotification(PChar(ExtractFilePath(FileName)),
    False, FILE_NOTIFY_CHANGE_FILE_NAME);
  if (INVALID_HANDLE_VALUE = WaitHandle) then
  begin
    {The path to the file does not exists}
    Exit;
  end;
  repeat
    if WaitForSingleObject(WaitHandle, INFINITE) = WAIT_OBJECT_0 then
    begin {Something happenned in the directory}
      if FileExists(FileName) then
      begin
        result := True;
        Break; {My file has been created, exit}
      end;
      {My file is not there, keep on}
      if not FindNextChangeNotification(WaitHandle) then
      begin
        {Something happened to the directory, maybe it was deleted}
        Break;
      end;
    end;
  until
    False;
  FindCloseChangeNotification(WaitHandle);
end;

<< Back to main page