Re: Next "available" File/Folder Name,...
Kerem G?mr?kc? wrote:
Hi Stefan,
Even if there is such a thing, what value would it give to you? Once
you had that "next available file/folder name" and just before you can
create it, your program can be preempted and someone else can
calculate this file/folder and create it, so what value will your
prior call to this imaginary function have?. Having a function that
does this as an API is subject to race conditions, so it is per se
useless, unless tightly coupled with a file/foldeer creation call. The
only sure thing is a function that tries to *create* the next possible
file/folder.
Yes, you are right on that. But it is quite sure that there will be no
race condition/deadlock, because the access to the folder is only
restricted to
a special process that only runs single instance, system and sessionwide
in a special account and the folder (where the subfolders/files) will be
created) has special NTFS restrictions only for the process user context.
Stefan's suggestion still applies. However, where (count) do you
begin? If its a single process/thread, you might as well use a
FindFirstFile()/FindNextFile() to get the highest count using a "New
File*.txt" specification, then +1 for the new file. If the applet is
24x7, then you can get that high count at startup.
Off hand:
int GetNextCount()
{
const char *pszSpec = "new file(*).txt";
int nHigh = 0;
WIN32_FIND_DATA fd;
HANDLE ff = FindFirstFile(pszSpec, &fd);
if (ff != INVALID_HANDLE_VALUE) {
do {
int n = atoi(fd.cFileName+9);
if (n > nHigh) nHigh = n;
} while(FindNextFile(ff,&fd));
FindClose(ff);
}
return nHigh+1;
}
Usage:
CString nfn;
nfn.Format("New File(%d)",GetNextCount())
Fine tune this to your specific paths/names. But has Stefan
highlighted, if you going to be having multiple access points,
threads, processes, etc, then doing a exclusive file open with
CreateFile() will work (after getting the highest count), then use a
loop to increment again if the file was created after the
findfirst/next search.
--
HLS