don't replace . and .. with the corresponding directoties names in GetLongPath() as this breaks the normalization of file names without wxPATH_NORM_DOTS flag (#9814)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56247 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1896,19 +1896,21 @@ wxString wxFileName::GetLongPath() const
|
|||||||
size_t count = dirs.GetCount();
|
size_t count = dirs.GetCount();
|
||||||
for ( size_t i = 0; i < count; i++ )
|
for ( size_t i = 0; i < count; i++ )
|
||||||
{
|
{
|
||||||
|
const wxString& dir = dirs[i];
|
||||||
|
|
||||||
// We're using pathOut to collect the long-name path, but using a
|
// We're using pathOut to collect the long-name path, but using a
|
||||||
// temporary for appending the last path component which may be
|
// temporary for appending the last path component which may be
|
||||||
// short-name
|
// short-name
|
||||||
tmpPath = pathOut + dirs[i];
|
tmpPath = pathOut + dir;
|
||||||
|
|
||||||
if ( tmpPath.empty() )
|
// We must not process "." or ".." here as they would be (unexpectedly)
|
||||||
continue;
|
// replaced by the corresponding directory names so just leave them
|
||||||
|
// alone
|
||||||
// can't see this being necessary? MF
|
//
|
||||||
if ( tmpPath.Last() == GetVolumeSeparator(wxPATH_DOS) )
|
// And we can't pass a drive and root dir to FindFirstFile (VZ: why?)
|
||||||
|
if ( tmpPath.empty() || dir == '.' || dir == ".." ||
|
||||||
|
tmpPath.Last() == GetVolumeSeparator(wxPATH_DOS) )
|
||||||
{
|
{
|
||||||
// Can't pass a drive and root dir to FindFirstFile,
|
|
||||||
// so continue to next dir
|
|
||||||
tmpPath += wxFILE_SEP_PATH;
|
tmpPath += wxFILE_SEP_PATH;
|
||||||
pathOut = tmpPath;
|
pathOut = tmpPath;
|
||||||
continue;
|
continue;
|
||||||
|
@@ -72,11 +72,13 @@ static struct TestFileNameInfo
|
|||||||
{ _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS },
|
{ _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS },
|
||||||
{ _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS },
|
{ _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS },
|
||||||
|
|
||||||
|
#if 0
|
||||||
// NB: when using the wxFileName::GetLongPath() function on these two
|
// NB: when using the wxFileName::GetLongPath() function on these two
|
||||||
// strings, the program will hang for several seconds blocking inside
|
// strings, the program will hang for several seconds blocking inside
|
||||||
// Win32 GetLongPathName() function
|
// Win32 GetLongPathName() function
|
||||||
{ _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS },
|
{ _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS },
|
||||||
{ _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS },
|
{ _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS },
|
||||||
|
#endif
|
||||||
|
|
||||||
// consecutive [back]slashes should be treated as single occurrences of
|
// consecutive [back]slashes should be treated as single occurrences of
|
||||||
// them and not interpreted as share names if there is a volume name
|
// them and not interpreted as share names if there is a volume name
|
||||||
@@ -94,10 +96,12 @@ static struct TestFileNameInfo
|
|||||||
{ _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC },
|
{ _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), false, wxPATH_MAC },
|
||||||
#endif // 0
|
#endif // 0
|
||||||
|
|
||||||
|
#if 0
|
||||||
// VMS file names
|
// VMS file names
|
||||||
// NB: on Windows they have the same effect of the \\server\\ strings
|
// NB: on Windows they have the same effect of the \\server\\ strings
|
||||||
// (see the note above)
|
// (see the note above)
|
||||||
{ _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS },
|
{ _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS },
|
||||||
|
#endif
|
||||||
{ _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS },
|
{ _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS },
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -328,7 +332,20 @@ void FileNameTestCase::TestNormalize()
|
|||||||
// test giving no flags at all to Normalize()
|
// test giving no flags at all to Normalize()
|
||||||
{ "a/b/", 0, "a/b/", wxPATH_UNIX },
|
{ "a/b/", 0, "a/b/", wxPATH_UNIX },
|
||||||
{ "a/b/c.ext", 0, "a/b/c.ext", wxPATH_UNIX },
|
{ "a/b/c.ext", 0, "a/b/c.ext", wxPATH_UNIX },
|
||||||
{ "/a", 0, "/a", wxPATH_UNIX }
|
{ "/a", 0, "/a", wxPATH_UNIX },
|
||||||
|
|
||||||
|
// test handling dots without wxPATH_NORM_DOTS and wxPATH_NORM_ABSOLUTE
|
||||||
|
// for both existing and non-existent files (this is important under
|
||||||
|
// MSW where GetLongPathName() works only for the former)
|
||||||
|
{ "./foo", wxPATH_NORM_LONG, "./foo", wxPATH_UNIX },
|
||||||
|
{ "../foo", wxPATH_NORM_LONG, "../foo", wxPATH_UNIX },
|
||||||
|
{ ".\\test.bkl", wxPATH_NORM_LONG, ".\\test.bkl", wxPATH_DOS },
|
||||||
|
{ ".\\foo", wxPATH_NORM_LONG, ".\\foo", wxPATH_DOS },
|
||||||
|
{ "..\\Makefile.in", wxPATH_NORM_LONG, "..\\Makefile.in", wxPATH_DOS },
|
||||||
|
{ "..\\foo", wxPATH_NORM_LONG, "..\\foo", wxPATH_DOS },
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
{ "..\\MKINST~1", wxPATH_NORM_LONG, "..\\mkinstalldirs", wxPATH_DOS },
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// set the env var ABCDEF
|
// set the env var ABCDEF
|
||||||
|
Reference in New Issue
Block a user