а вот так
//проверка файла на существование
//проверяет как файл, так и папку.
//Если надо найти папку, а в имени искомой папки
//на конце есть слеш, - то приписать "*", тогда
//папка найдётся
bool st_IsFileExists(LPCSTR lpPathName)
{
HANDLE file=0;
WIN32_FIND_DATA w32fd;
::memset(&w32fd,0,sizeof(w32fd));
w32fd.ftCreationTime.dwHighDateTime=-1;
w32fd.ftLastAccessTime.dwHighDateTime=-1;
w32fd.ftLastWriteTime.dwHighDateTime=-1;
w32fd.nFileSizeHigh=-1;
w32fd.nFileSizeLow=-1;
file=::FindFirstFile(lpPathName,&w32fd);
if(file==INVALID_HANDLE_VALUE || file==0)
{
//файл не найден
return false;
}
//файл найден
::FindClose(file);
//реальное имя найденного файла
//w32fd.cFileName;
return true;
}
//создать директорию- обеспечить создание полного пути к, если его нету
//(!!! ДОДЕЛАТЬ !!!)
BOOL st_CreateDirectoryEnsureFullPath(
LPCSTR lpPathName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes=0
)
{
CString PathToCr__=lpPathName;
if(PathToCr__.GetLength()<=0)return 0;
//обеспечиваем слеш на конце
if(PathToCr__[PathToCr__.GetLength()-1]!='\\')
{
PathToCr__+='\\';
}
if(st_IsFileExists(PathToCr__+'*'))return 1;
if(!::CreateDirectory(lpPathName,lpSecurityAttributes))
{
DWORD dwd=::GetLastError();
//Cannot create a file when that file already exists. ERROR_ALREADY_EXISTS
if(dwd==ERROR_ALREADY_EXISTS)
{
}
else
{
//возможно, есть вложенности
CString txt="cmd.exe /q /c md "+PathToCr__;
st_RunProcessAndWaitWhenDone(0,txt);
}
}
if(st_IsFileExists(PathToCr__+'*'))return 1;
return 0;
}
//Zuko - это такой мерзкий сок в порошке был, если кто помнит ))
//bHasFileAtEndOfThePath - это уточнение на случай, когда путь ещё не существует или существует не полностью
CString st_GetShortPathNameSmartZuko(const char* pchLongPath)
{
CString csResult="";
CString csSource=pchLongPath;
if(csSource=="")return"";
//определяем, существует ли объект, указанный в пути, а также
bool bWasSlash=false;
//убираем слеш с конца пути, если он там
while(csSource[csSource.GetLength()-1]=='\\')
{
bWasSlash=true;
csSource=csSource.Left(csSource.GetLength()-1);
}
bool dWasExists=false;
if(st_IsFileExists(csSource))
{
//объект существует
dWasExists=true;
}
bool dTestWasCreated=false;
//если файл не существует ещё, тупо пытаемся создать такую
if(!dWasExists)
{
//создаём тестовый путь, если надо. Создастся папка с именем, как у будущего файла
if(st_CreateDirectoryEnsureFullPath(csSource))
{
dTestWasCreated=true;
}
}
DWORD dwdLen=::GetShortPathName(csSource,0,0);
if(dwdLen)
{
//буфер для коротыша
char* pShort=new char[dwdLen+1];
::memset(pShort,0,dwdLen+1);
::GetShortPathName(csSource,pShort,dwdLen);
csResult=pShort;
delete [] pShort;
pShort=0;
}
//удалить тестовый папк (однако весь "хвост" предыдущих папок остаётся)
if(dTestWasCreated)
{
::RemoveDirectory(csSource);
}
if(bWasSlash)
{
csResult+='\\';
}
return csResult;
}
пример вызова
CString csSh="";
csSh=st_GetShortPathNameSmartZuko("c:\\2ы22\\339ы3\\\\\\\\");
csSh=st_GetShortPathNameSmartZuko("c:\\2ы22\\33ы3");
csSh=st_GetShortPathNameSmartZuko("c:\\3ы33\\44ы4\\");
csSh=st_GetShortPathNameSmartZuko("c:\\55ы5\\6ы66\\fff");
csSh=st_GetShortPathNameSmartZuko("~c:\\55ы5\\6ы66\\fff");