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
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();

View File

@ -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);