|
Boost : |
From: Yitzhak Sapir (yitzhak.sapir_at_[hidden])
Date: 2006-08-20 05:34:28
The following MSDN article treats the issue of invalid characters
in filenames:
http://support.microsoft.com/kb/177506/EN-US/
Another article has a similar text (but misses the asterisk in the list):
http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/w2000Msgs/2993.mspx
A simple cpp program also throws on this simple issue. For example,
with a question mark:
#include "windows.h"
int main(int argc, char* argv[])
{
HANDLE hf = ::CreateFile("c:\\hi?.c", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, 0);
if (hf == INVALID_HANDLE_VALUE) {
std::cout << GetLastError() << std::endl;
} else {
::CloseHandle(hf);
std::cout << "Success" << std::endl;
}
return 0;
}
The value returned is ERROR_INVALID_NAME == 123L from winerror.h
However, boost::filesystem::path::windows_name does not have a problem
with a question mark or asterisk. Also, the implementation seems to
attempt to validate any name unless it has these characters whereas it
could use a "valid list" like the unix implementation does. A missing
character from the valid list will probably be an inconvenience but not
as much of a problem as a missing character from the invalid list. My
guess is that an implementation that wishes to support Unicode characters
will need to use the GetStringTypeW or IsCharAlphaNumeric functions to
determine if a letter is an alphanumeric character. Perhaps it is best to
use an implementation that runs "CreateFile(filename, GENERIC_READ, 0, NULL,
OPEN_EXISTING, 0, 0)" and checks the error code for ERROR_INVALID_NAME to
decide if it is a valid filename or not.
Yitzhak Sapir
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk