Fast Get File Modification Time

Giving the path of a file, does anyone know a faster way to get the LastWrite time, than the following ?

// Try with GetFileTime, fast but I think it may fail if file is locked, but I haven't been able to provoke it

TimeFound = 0;
h = CreateFile(FileName, 0, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (h >= 0) {
  if (GetFileTime(h, CreateTime, LastAccess, LastWrite)) {
   TimeFound = 1;
  }
}

if (!TimeFound) {
  // Get time using FindFirstFile, slow but don't care if file locked.
}
LVL 1
hustchAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

nietodCommented:
That looks like that should work well.  It shouldn't be too slow even when the FindFirstFile needs to be used.  

The "FILE_SHARE_READ or FILE_SHARE_WRITE" should be expressed as "FILE_SHARE_READ || FILE_SHARE_WRITE"  in C or C++, however.
0
chensuCommented:
What do you mean by a faster way? One function call or faster speed?

If you are looking for one function call:

On Windows NT 4.0 or later, you can use the GetFileAttributesEx function to get the information.

You can also use FindFirstFile. But you have to use FindClose.

By the way, it should be | instead of ||.
0
nietodCommented:
Opps.  Correct a mistake with a mistake.  Yes,

"FILE_SHARE_READ | FILE_SHARE_WRITE"

Chensu got me thinking too.  Looking at what you had I was lured into thinking that by opening the file with CreateFile() the OS would not have to search the directory tree and would therefore be faster.  That was stupid on my part.  The OS will still search, only it will do it on the open rather than on the procedure that gets the time.  In addition there is considerable overhead for opening and closing a file.  You are probably best off just using FindFirstFile (and associated procedures) in all cases.
0
Cloud Class® Course: Microsoft Office 2010

This course will introduce you to the interfaces and features of Microsoft Office 2010 Word, Excel, PowerPoint, Outlook, and Access. You will learn about the features that are shared between all products in the Office suite, as well as the new features that are product specific.

hustchAuthor Commented:
The or got there because it is actually Delphi code, that I translated because it is not the Delphi forum.
I know I have to use FindClose.

By faster, I mean shorter execution times.

The CreateFile is a lot faster, I don't know why, but I timed it. There is a lot of files in the directory.
The parameters to CreateFile was chosen in an attempt to avoid sharing problems.
I'll try GetFileAttributesEx
0
nietodCommented:
There are probably plenty of people here who "speak" delphi, so you ussually shouldn't have to translate.

When you use FindFirstFile(), do you use a path that specifcally indicates the file?  You don't use wildcards and then look fo the file do you?
0
hustchAuthor Commented:
The GetFileAttirbutesEx is faster than the CreateFile approach.
It is what i wanted when I started, but I can't find using Delphi help, but I found it using MSVC++ help.

chensu, make an answer with GetFileAtttibutesEx, and I will accept it.
0
chensuCommented:
On Windows NT 4.0 or later, you can use the GetFileAttributesEx function to get the information.

Thank you.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Development

From novice to tech pro — start learning today.