Merge branch 'fn-long-path'
Fix wxPATH_NORM_LONG with UNC paths and slightly optimize long path normalization. See #22307.
This commit is contained in:
commit
b66d4488e1
@ -2232,16 +2232,27 @@ wxString wxFileName::GetLongPath() const
|
|||||||
return pathOut;
|
return pathOut;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else // GetLongPathName() failed.
|
||||||
|
{
|
||||||
|
// The error returned for non-existent UNC paths is different, to make
|
||||||
|
// things more interesting.
|
||||||
|
const DWORD err = ::GetLastError();
|
||||||
|
if ( err == ERROR_FILE_NOT_FOUND || err == ERROR_BAD_NETPATH )
|
||||||
|
{
|
||||||
|
// No need to try to do anything else, we're not going to be able
|
||||||
|
// to find a long path form of a non-existent path anyhow.
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Some other error occured.
|
// File exists, but some other error occurred.
|
||||||
// We need to call FindFirstFile on each component in turn.
|
// We need to call FindFirstFile on each component in turn.
|
||||||
|
|
||||||
WIN32_FIND_DATA findFileData;
|
WIN32_FIND_DATA findFileData;
|
||||||
HANDLE hFind;
|
HANDLE hFind;
|
||||||
|
|
||||||
if ( HasVolume() )
|
if ( HasVolume() )
|
||||||
pathOut = GetVolume() +
|
pathOut = wxGetVolumeString(GetVolume(), wxPATH_DOS) +
|
||||||
GetVolumeSeparator(wxPATH_DOS) +
|
|
||||||
GetPathSeparator(wxPATH_DOS);
|
GetPathSeparator(wxPATH_DOS);
|
||||||
else
|
else
|
||||||
pathOut.clear();
|
pathOut.clear();
|
||||||
|
@ -545,15 +545,29 @@ TEST_CASE("wxFileName::ShortLongPath", "[filename]")
|
|||||||
|
|
||||||
#endif // __WINDOWS__
|
#endif // __WINDOWS__
|
||||||
|
|
||||||
|
// Small helper to make things slightly less verbose in the tests below.
|
||||||
|
static wxString GetDOSPath(const wxFileName& fn)
|
||||||
|
{
|
||||||
|
return fn.GetPath(wxPATH_NO_SEPARATOR, wxPATH_DOS);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("wxFileName::UNC", "[filename]")
|
TEST_CASE("wxFileName::UNC", "[filename]")
|
||||||
{
|
{
|
||||||
wxFileName fn("//share/path/name.ext", wxPATH_DOS);
|
wxFileName fn("//share/path/name.ext", wxPATH_DOS);
|
||||||
CHECK( fn.GetVolume() == "\\\\share" );
|
CHECK( fn.GetVolume() == "\\\\share" );
|
||||||
CHECK( fn.GetPath(wxPATH_NO_SEPARATOR, wxPATH_DOS) == "\\path" );
|
CHECK( GetDOSPath(fn) == "\\path" );
|
||||||
|
|
||||||
fn.Assign("\\\\share2\\path2\\name.ext", wxPATH_DOS);
|
fn.Assign("\\\\share2\\path2\\name.ext", wxPATH_DOS);
|
||||||
CHECK( fn.GetVolume() == "\\\\share2" );
|
CHECK( fn.GetVolume() == "\\\\share2" );
|
||||||
CHECK( fn.GetPath(wxPATH_NO_SEPARATOR, wxPATH_DOS) == "\\path2" );
|
CHECK( GetDOSPath(fn) == "\\path2" );
|
||||||
|
|
||||||
|
fn.SetPath("\\\\server\\volume\\path", wxPATH_DOS);
|
||||||
|
fn.AppendDir("subdir");
|
||||||
|
CHECK( fn.GetFullPath(wxPATH_DOS) == "\\\\server\\volume\\path\\subdir\\name.ext" );
|
||||||
|
|
||||||
|
// Check for a bug with normalization breaking the path (#22275).
|
||||||
|
fn.Normalize(wxPATH_NORM_LONG);
|
||||||
|
CHECK( fn.GetFullPath(wxPATH_DOS) == "\\\\server\\volume\\path\\subdir\\name.ext" );
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
// Check that doubled backslashes in the beginning of the path are not
|
// Check that doubled backslashes in the beginning of the path are not
|
||||||
@ -574,13 +588,13 @@ TEST_CASE("wxFileName::VolumeUniqueName", "[filename]")
|
|||||||
wxFileName fn("\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}\\",
|
wxFileName fn("\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}\\",
|
||||||
wxPATH_DOS);
|
wxPATH_DOS);
|
||||||
CHECK( fn.GetVolume() == "\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}" );
|
CHECK( fn.GetVolume() == "\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}" );
|
||||||
CHECK( fn.GetPath(wxPATH_NO_SEPARATOR, wxPATH_DOS) == "\\" );
|
CHECK( GetDOSPath(fn) == "\\" );
|
||||||
CHECK( fn.GetFullPath(wxPATH_DOS) == "\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}\\" );
|
CHECK( fn.GetFullPath(wxPATH_DOS) == "\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}\\" );
|
||||||
|
|
||||||
fn.Assign("\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}\\"
|
fn.Assign("\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}\\"
|
||||||
"Program Files\\setup.exe", wxPATH_DOS);
|
"Program Files\\setup.exe", wxPATH_DOS);
|
||||||
CHECK( fn.GetVolume() == "\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}" );
|
CHECK( fn.GetVolume() == "\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}" );
|
||||||
CHECK( fn.GetPath(wxPATH_NO_SEPARATOR, wxPATH_DOS) == "\\Program Files" );
|
CHECK( GetDOSPath(fn) == "\\Program Files" );
|
||||||
CHECK( fn.GetFullPath(wxPATH_DOS) == "\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}\\Program Files\\setup.exe" );
|
CHECK( fn.GetFullPath(wxPATH_DOS) == "\\\\?\\Volume{8089d7d7-d0ac-11db-9dd0-806d6172696f}\\Program Files\\setup.exe" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user