basic wxFileName functions seem to work under Windows
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14829 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
0e2c5534fe
commit
a2fa504087
@ -91,7 +91,7 @@
|
||||
#undef TEST_ALL
|
||||
static const bool TEST_ALL = TRUE;
|
||||
#else
|
||||
#define TEST_VOLUME
|
||||
#define TEST_FILENAME
|
||||
|
||||
static const bool TEST_ALL = FALSE;
|
||||
#endif
|
||||
@ -802,6 +802,8 @@ static struct FileNameInfo
|
||||
{ _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE, wxPATH_DOS },
|
||||
{ _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS },
|
||||
|
||||
// wxFileName support for Mac file names is broken crurently
|
||||
#if 0
|
||||
// Mac file names
|
||||
{ _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE, wxPATH_MAC },
|
||||
{ _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE, wxPATH_MAC },
|
||||
@ -809,6 +811,7 @@ static struct FileNameInfo
|
||||
{ _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE, wxPATH_MAC },
|
||||
{ _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
|
||||
|
||||
// VMS file names
|
||||
{ _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE, wxPATH_VMS },
|
||||
@ -831,7 +834,7 @@ static void TestFileNameConstruction()
|
||||
printf("ERROR: fullname should be '%s'\n", fni.fullname);
|
||||
}
|
||||
|
||||
bool isAbsolute = fn.IsAbsolute();
|
||||
bool isAbsolute = fn.IsAbsolute(fni.format);
|
||||
printf("'%s' is %s (%s)\n\t",
|
||||
fullname.c_str(),
|
||||
isAbsolute ? "absolute" : "relative",
|
||||
@ -884,11 +887,14 @@ static void TestFileNameTemp()
|
||||
|
||||
static const char *tmpprefixes[] =
|
||||
{
|
||||
"",
|
||||
"foo",
|
||||
"/tmp/foo",
|
||||
"..",
|
||||
"../bar",
|
||||
#ifdef __UNIX__
|
||||
"/tmp/foo",
|
||||
"/tmp/foo/bar", // this one must be an error
|
||||
#endif // __UNIX__
|
||||
};
|
||||
|
||||
for ( size_t n = 0; n < WXSIZEOF(tmpprefixes); n++ )
|
||||
@ -5693,7 +5699,7 @@ int main(int argc, char **argv)
|
||||
#endif // TEST_FILE
|
||||
|
||||
#ifdef TEST_FILENAME
|
||||
if ( 1 )
|
||||
if ( 0 )
|
||||
{
|
||||
wxFileName fn;
|
||||
fn.Assign("c:\\foo", "bar.baz");
|
||||
@ -5701,7 +5707,7 @@ int main(int argc, char **argv)
|
||||
DumpFileName(fn);
|
||||
}
|
||||
|
||||
if ( TEST_ALL )
|
||||
if ( 1 )
|
||||
{
|
||||
TestFileNameConstruction();
|
||||
TestFileNameMakeRelative();
|
||||
|
@ -252,7 +252,7 @@ void wxFileName::Assign( const wxFileName &filepath )
|
||||
m_dirs = filepath.GetDirs();
|
||||
m_name = filepath.GetName();
|
||||
m_ext = filepath.GetExt();
|
||||
m_relative = filepath.IsRelative();
|
||||
m_relative = filepath.m_relative;
|
||||
}
|
||||
|
||||
void wxFileName::Assign(const wxString& volume,
|
||||
@ -270,19 +270,21 @@ void wxFileName::Assign(const wxString& volume,
|
||||
|
||||
void wxFileName::SetPath( const wxString &path, wxPathFormat format )
|
||||
{
|
||||
wxPathFormat my_format = GetFormat( format );
|
||||
wxString my_path = path;
|
||||
|
||||
m_dirs.Clear();
|
||||
|
||||
if (!my_path.empty())
|
||||
if ( !path.empty() )
|
||||
{
|
||||
wxPathFormat my_format = GetFormat( format );
|
||||
wxString my_path = path;
|
||||
|
||||
// 1) Determine if the path is relative or absolute.
|
||||
wxChar leadingChar = my_path[0u];
|
||||
|
||||
switch (my_format)
|
||||
{
|
||||
case wxPATH_MAC:
|
||||
m_relative = ( my_path[0u] == wxT(':') );
|
||||
m_relative = leadingChar == wxT(':');
|
||||
|
||||
// We then remove a leading ":". The reason is in our
|
||||
// storage form for relative paths:
|
||||
// ":dir:file.txt" actually means "./dir/file.txt" in
|
||||
@ -294,18 +296,23 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
|
||||
// actually means <UP>, whereas under DOS, double
|
||||
// slashes can be ignored: "\\\\" is the same as "\\".
|
||||
if (m_relative)
|
||||
my_path.Remove( 0, 1 );
|
||||
my_path.erase( 0, 1 );
|
||||
break;
|
||||
|
||||
case wxPATH_VMS:
|
||||
// TODO: what is the relative path format here?
|
||||
m_relative = FALSE;
|
||||
break;
|
||||
|
||||
case wxPATH_UNIX:
|
||||
m_relative = ( my_path[0u] != wxT('/') );
|
||||
// the paths of the form "~" or "~username" are absolute
|
||||
m_relative = leadingChar != wxT('/') && leadingChar != _T('~');
|
||||
break;
|
||||
|
||||
case wxPATH_DOS:
|
||||
m_relative = ( (my_path[0u] != wxT('/')) && (my_path[0u] != wxT('\\')) );
|
||||
m_relative = !IsPathSeparator(leadingChar, my_format);
|
||||
break;
|
||||
|
||||
default:
|
||||
wxFAIL_MSG( wxT("error") );
|
||||
break;
|
||||
@ -335,7 +342,7 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else // no path at all
|
||||
{
|
||||
m_relative = TRUE;
|
||||
}
|
||||
@ -531,6 +538,12 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp)
|
||||
dir = _T('.');
|
||||
}
|
||||
}
|
||||
else // we have a dir to create the file in
|
||||
{
|
||||
// ensure we use only the back slashes as GetTempFileName(), unlike all
|
||||
// the other APIs, is picky and doesn't accept the forward ones
|
||||
dir.Replace(_T("/"), _T("\\"));
|
||||
}
|
||||
|
||||
if ( !::GetTempFileName(dir, name, 0, wxStringBuffer(path, MAX_PATH + 1)) )
|
||||
{
|
||||
@ -766,7 +779,7 @@ bool wxFileName::Normalize(int flags,
|
||||
format = GetFormat(format);
|
||||
|
||||
// make the path absolute
|
||||
if ( (flags & wxPATH_NORM_ABSOLUTE) && m_relative )
|
||||
if ( (flags & wxPATH_NORM_ABSOLUTE) && !IsAbsolute(format) )
|
||||
{
|
||||
if ( cwd.empty() )
|
||||
{
|
||||
@ -777,7 +790,6 @@ bool wxFileName::Normalize(int flags,
|
||||
curDir.AssignDir(cwd);
|
||||
}
|
||||
|
||||
#if 0
|
||||
// the path may be not absolute because it doesn't have the volume name
|
||||
// but in this case we shouldn't modify the directory components of it
|
||||
// but just set the current volume
|
||||
@ -785,14 +797,12 @@ bool wxFileName::Normalize(int flags,
|
||||
{
|
||||
SetVolume(curDir.GetVolume());
|
||||
|
||||
if ( IsAbsolute() )
|
||||
if ( !m_relative )
|
||||
{
|
||||
// yes, it was the case - we don't need curDir then
|
||||
curDir.Clear();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
m_relative = FALSE;
|
||||
}
|
||||
|
||||
// handle ~ stuff under Unix only
|
||||
@ -880,6 +890,31 @@ bool wxFileName::Normalize(int flags,
|
||||
}
|
||||
#endif // Win32
|
||||
|
||||
// we do have the path now
|
||||
m_relative = FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// absolute/relative paths
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxFileName::IsAbsolute(wxPathFormat format) const
|
||||
{
|
||||
// if our path doesn't start with a path separator, it's not an absolute
|
||||
// path
|
||||
if ( m_relative )
|
||||
return FALSE;
|
||||
|
||||
if ( !GetVolumeSeparator(format).empty() )
|
||||
{
|
||||
// this format has volumes and an absolute path must have one, it's not
|
||||
// enough to have the full path to bean absolute file under Windows
|
||||
if ( GetVolume().empty() )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -1012,11 +1047,10 @@ bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format)
|
||||
return GetPathSeparators(format).Find(ch) != wxNOT_FOUND;
|
||||
}
|
||||
|
||||
bool wxFileName::IsWild( wxPathFormat format )
|
||||
bool wxFileName::IsWild( wxPathFormat WXUNUSED(format) )
|
||||
{
|
||||
// FIXME: this is probably false for Mac and this is surely wrong for most
|
||||
// of Unix shells (think about "[...]")
|
||||
(void)format;
|
||||
return m_name.find_first_of(_T("*?")) != wxString::npos;
|
||||
}
|
||||
|
||||
@ -1064,10 +1098,8 @@ wxString wxFileName::GetFullName() const
|
||||
return fullname;
|
||||
}
|
||||
|
||||
wxString wxFileName::GetPath( bool, wxPathFormat format ) const
|
||||
wxString wxFileName::GetPath( bool add_separator, wxPathFormat format ) const
|
||||
{
|
||||
// Should add_seperator parameter be used?
|
||||
|
||||
format = GetFormat( format );
|
||||
|
||||
wxString fullpath;
|
||||
@ -1143,7 +1175,10 @@ wxString wxFileName::GetPath( bool, wxPathFormat format ) const
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( add_separator && !fullpath.empty() )
|
||||
{
|
||||
fullpath += GetPathSeparators(format)[0u];
|
||||
}
|
||||
|
||||
return fullpath;
|
||||
}
|
||||
@ -1175,19 +1210,27 @@ wxString wxFileName::GetFullPath( wxPathFormat format ) const
|
||||
}
|
||||
|
||||
// the leading character
|
||||
if ( format == wxPATH_MAC && m_relative )
|
||||
if ( format == wxPATH_MAC )
|
||||
{
|
||||
fullpath += wxFILE_SEP_PATH_MAC;
|
||||
if ( m_relative )
|
||||
fullpath += wxFILE_SEP_PATH_MAC;
|
||||
}
|
||||
else if ( format == wxPATH_DOS )
|
||||
{
|
||||
if (!m_relative)
|
||||
fullpath += wxFILE_SEP_PATH_DOS;
|
||||
if ( !m_relative )
|
||||
fullpath += wxFILE_SEP_PATH_DOS;
|
||||
}
|
||||
else if ( format == wxPATH_UNIX )
|
||||
{
|
||||
if (!m_relative)
|
||||
fullpath += wxFILE_SEP_PATH_UNIX;
|
||||
if ( !m_relative )
|
||||
{
|
||||
// normally the absolute file names starts with a slash with one
|
||||
// exception: file names like "~/foo.bar" don't have it
|
||||
if ( m_dirs.IsEmpty() || m_dirs[0u] != _T('~') )
|
||||
{
|
||||
fullpath += wxFILE_SEP_PATH_UNIX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// then concatenate all the path components using the path separator
|
||||
@ -1287,7 +1330,7 @@ wxString wxFileName::GetLongPath() const
|
||||
#if defined(__WIN32__) && !defined(__WXMICROWIN__)
|
||||
bool success = FALSE;
|
||||
|
||||
// VZ: this code was disabled, why?
|
||||
// VZ: why was this code disabled?
|
||||
#if 0 // wxUSE_DYNAMIC_LOADER
|
||||
typedef DWORD (*GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user