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:
Vadim Zeitlin
2002-03-28 00:29:13 +00:00
parent 0e2c5534fe
commit a2fa504087
2 changed files with 82 additions and 33 deletions

View File

@@ -91,7 +91,7 @@
#undef TEST_ALL #undef TEST_ALL
static const bool TEST_ALL = TRUE; static const bool TEST_ALL = TRUE;
#else #else
#define TEST_VOLUME #define TEST_FILENAME
static const bool TEST_ALL = FALSE; static const bool TEST_ALL = FALSE;
#endif #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("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 }, { _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 // Mac file names
{ _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE, wxPATH_MAC }, { _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 }, { _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(":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 },
{ _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 // VMS file names
{ _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 },
@@ -831,7 +834,7 @@ static void TestFileNameConstruction()
printf("ERROR: fullname should be '%s'\n", fni.fullname); 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", printf("'%s' is %s (%s)\n\t",
fullname.c_str(), fullname.c_str(),
isAbsolute ? "absolute" : "relative", isAbsolute ? "absolute" : "relative",
@@ -884,11 +887,14 @@ static void TestFileNameTemp()
static const char *tmpprefixes[] = static const char *tmpprefixes[] =
{ {
"",
"foo", "foo",
"/tmp/foo",
"..", "..",
"../bar", "../bar",
#ifdef __UNIX__
"/tmp/foo",
"/tmp/foo/bar", // this one must be an error "/tmp/foo/bar", // this one must be an error
#endif // __UNIX__
}; };
for ( size_t n = 0; n < WXSIZEOF(tmpprefixes); n++ ) for ( size_t n = 0; n < WXSIZEOF(tmpprefixes); n++ )
@@ -5693,7 +5699,7 @@ int main(int argc, char **argv)
#endif // TEST_FILE #endif // TEST_FILE
#ifdef TEST_FILENAME #ifdef TEST_FILENAME
if ( 1 ) if ( 0 )
{ {
wxFileName fn; wxFileName fn;
fn.Assign("c:\\foo", "bar.baz"); fn.Assign("c:\\foo", "bar.baz");
@@ -5701,7 +5707,7 @@ int main(int argc, char **argv)
DumpFileName(fn); DumpFileName(fn);
} }
if ( TEST_ALL ) if ( 1 )
{ {
TestFileNameConstruction(); TestFileNameConstruction();
TestFileNameMakeRelative(); TestFileNameMakeRelative();

View File

@@ -252,7 +252,7 @@ void wxFileName::Assign( const wxFileName &filepath )
m_dirs = filepath.GetDirs(); m_dirs = filepath.GetDirs();
m_name = filepath.GetName(); m_name = filepath.GetName();
m_ext = filepath.GetExt(); m_ext = filepath.GetExt();
m_relative = filepath.IsRelative(); m_relative = filepath.m_relative;
} }
void wxFileName::Assign(const wxString& volume, void wxFileName::Assign(const wxString& volume,
@@ -270,19 +270,21 @@ void wxFileName::Assign(const wxString& volume,
void wxFileName::SetPath( const wxString &path, wxPathFormat format ) void wxFileName::SetPath( const wxString &path, wxPathFormat format )
{ {
m_dirs.Clear();
if ( !path.empty() )
{
wxPathFormat my_format = GetFormat( format ); wxPathFormat my_format = GetFormat( format );
wxString my_path = path; wxString my_path = path;
m_dirs.Clear();
if (!my_path.empty())
{
// 1) Determine if the path is relative or absolute. // 1) Determine if the path is relative or absolute.
wxChar leadingChar = my_path[0u];
switch (my_format) switch (my_format)
{ {
case wxPATH_MAC: case wxPATH_MAC:
m_relative = ( my_path[0u] == wxT(':') ); m_relative = leadingChar == wxT(':');
// We then remove a leading ":". The reason is in our // We then remove a leading ":". The reason is in our
// storage form for relative paths: // storage form for relative paths:
// ":dir:file.txt" actually means "./dir/file.txt" in // ":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 // actually means <UP>, whereas under DOS, double
// slashes can be ignored: "\\\\" is the same as "\\". // slashes can be ignored: "\\\\" is the same as "\\".
if (m_relative) if (m_relative)
my_path.Remove( 0, 1 ); my_path.erase( 0, 1 );
break; break;
case wxPATH_VMS: case wxPATH_VMS:
// TODO: what is the relative path format here? // TODO: what is the relative path format here?
m_relative = FALSE; m_relative = FALSE;
break; break;
case wxPATH_UNIX: 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; break;
case wxPATH_DOS: case wxPATH_DOS:
m_relative = ( (my_path[0u] != wxT('/')) && (my_path[0u] != wxT('\\')) ); m_relative = !IsPathSeparator(leadingChar, my_format);
break; break;
default: default:
wxFAIL_MSG( wxT("error") ); wxFAIL_MSG( wxT("error") );
break; break;
@@ -335,7 +342,7 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
} }
} }
} }
else else // no path at all
{ {
m_relative = TRUE; m_relative = TRUE;
} }
@@ -531,6 +538,12 @@ wxFileName::CreateTempFileName(const wxString& prefix, wxFile *fileTemp)
dir = _T('.'); 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)) ) if ( !::GetTempFileName(dir, name, 0, wxStringBuffer(path, MAX_PATH + 1)) )
{ {
@@ -766,7 +779,7 @@ bool wxFileName::Normalize(int flags,
format = GetFormat(format); format = GetFormat(format);
// make the path absolute // make the path absolute
if ( (flags & wxPATH_NORM_ABSOLUTE) && m_relative ) if ( (flags & wxPATH_NORM_ABSOLUTE) && !IsAbsolute(format) )
{ {
if ( cwd.empty() ) if ( cwd.empty() )
{ {
@@ -777,7 +790,6 @@ bool wxFileName::Normalize(int flags,
curDir.AssignDir(cwd); curDir.AssignDir(cwd);
} }
#if 0
// the path may be not absolute because it doesn't have the volume name // 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 in this case we shouldn't modify the directory components of it
// but just set the current volume // but just set the current volume
@@ -785,14 +797,12 @@ bool wxFileName::Normalize(int flags,
{ {
SetVolume(curDir.GetVolume()); SetVolume(curDir.GetVolume());
if ( IsAbsolute() ) if ( !m_relative )
{ {
// yes, it was the case - we don't need curDir then // yes, it was the case - we don't need curDir then
curDir.Clear(); curDir.Clear();
} }
} }
#endif
m_relative = FALSE;
} }
// handle ~ stuff under Unix only // handle ~ stuff under Unix only
@@ -880,6 +890,31 @@ bool wxFileName::Normalize(int flags,
} }
#endif // Win32 #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; return TRUE;
} }
@@ -1012,11 +1047,10 @@ bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format)
return GetPathSeparators(format).Find(ch) != wxNOT_FOUND; 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 // FIXME: this is probably false for Mac and this is surely wrong for most
// of Unix shells (think about "[...]") // of Unix shells (think about "[...]")
(void)format;
return m_name.find_first_of(_T("*?")) != wxString::npos; return m_name.find_first_of(_T("*?")) != wxString::npos;
} }
@@ -1064,10 +1098,8 @@ wxString wxFileName::GetFullName() const
return fullname; 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 ); format = GetFormat( format );
wxString fullpath; wxString fullpath;
@@ -1143,7 +1175,10 @@ wxString wxFileName::GetPath( bool, wxPathFormat format ) const
} }
} }
if ( add_separator && !fullpath.empty() )
{
fullpath += GetPathSeparators(format)[0u];
}
return fullpath; return fullpath;
} }
@@ -1175,20 +1210,28 @@ wxString wxFileName::GetFullPath( wxPathFormat format ) const
} }
// the leading character // the leading character
if ( format == wxPATH_MAC && m_relative ) if ( format == wxPATH_MAC )
{ {
if ( m_relative )
fullpath += wxFILE_SEP_PATH_MAC; fullpath += wxFILE_SEP_PATH_MAC;
} }
else if ( format == wxPATH_DOS ) else if ( format == wxPATH_DOS )
{ {
if (!m_relative) if ( !m_relative )
fullpath += wxFILE_SEP_PATH_DOS; fullpath += wxFILE_SEP_PATH_DOS;
} }
else if ( format == wxPATH_UNIX ) else if ( format == wxPATH_UNIX )
{ {
if (!m_relative) 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; fullpath += wxFILE_SEP_PATH_UNIX;
} }
}
}
// then concatenate all the path components using the path separator // then concatenate all the path components using the path separator
size_t dirCount = m_dirs.GetCount(); size_t dirCount = m_dirs.GetCount();
@@ -1287,7 +1330,7 @@ wxString wxFileName::GetLongPath() const
#if defined(__WIN32__) && !defined(__WXMICROWIN__) #if defined(__WIN32__) && !defined(__WXMICROWIN__)
bool success = FALSE; bool success = FALSE;
// VZ: this code was disabled, why? // VZ: why was this code disabled?
#if 0 // wxUSE_DYNAMIC_LOADER #if 0 // wxUSE_DYNAMIC_LOADER
typedef DWORD (*GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD); typedef DWORD (*GET_LONG_PATH_NAME)(const wxChar *, wxChar *, DWORD);