BOOL FarChDir(const string& NewDir, BOOL ChangeDir) { if (NewDir.empty()) return FALSE; BOOL rc=FALSE; string Drive(L"=A:"); string strCurDir; // если указана только буква диска, то путь возьмем из переменной if (NewDir.size() == 2 && NewDir[1]==L':') { Drive[1] = ToUpper(NewDir[0]); if (!api::env::get_variable(Drive, strCurDir)) { strCurDir = NewDir; AddEndSlash(strCurDir); ReplaceSlashToBSlash(strCurDir); } if (ChangeDir) { rc=api::SetCurrentDirectory(strCurDir); } } else { if (ChangeDir) { strCurDir = NewDir; if (strCurDir == L"\\") api::GetCurrentDirectory(strCurDir); // здесь берем корень ReplaceSlashToBSlash(strCurDir); ConvertNameToFull(NewDir,strCurDir); PrepareDiskPath(strCurDir,false); // resolving not needed, very slow rc=api::SetCurrentDirectory(strCurDir); } } if (rc || !ChangeDir) { if ((!ChangeDir || api::GetCurrentDirectory(strCurDir)) && strCurDir.size() > 1 && strCurDir[1]==L':') { Drive[1] = ToUpper(strCurDir[0]); api::env::set_variable(Drive, strCurDir); } } return rc; }
void NTPath::Transform() { string& Data = *this; if (!Data.IsEmpty()) { if(!HasPathPrefix(Data)) { ConvertNameToFull(Data,Data); if (!HasPathPrefix(Data)) { ReplaceSlashToBSlash(Data); string Prefix(ParsePath(Data) == PATH_DRIVELETTER? L"\\\\?\\" : L"\\\\?\\UNC"); while(ReplaceStrings(Data,L"\\\\",L"\\")); Data=Prefix+Data; } } if(Data.At(5) == L':') { // "\\?\C:" -> "\\?\c:" // Some file operations fails on Win2k if a drive letter is in upper case Lower(4,1); } } }