filefn.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,984 行 · 第 1/4 页
CPP
1,984 行
// Some compilers don't like this line.
// const wxChar trimchars[] = wxT("\n \t");
wxChar trimchars[4];
trimchars[0] = wxT('\n');
trimchars[1] = wxT(' ');
trimchars[2] = wxT('\t');
trimchars[3] = 0;
#ifdef __WXMSW__
const wxChar SEP = wxT('\\');
#else
const wxChar SEP = wxT('/');
#endif
buf[0] = wxT('\0');
if (name == NULL || *name == wxT('\0'))
return buf;
nm = MYcopystring(name); // Make a scratch copy
wxChar *nm_tmp = nm;
/* Skip leading whitespace and cr */
while (wxStrchr((wxChar *)trimchars, *nm) != NULL)
nm++;
/* And strip off trailing whitespace and cr */
s = nm + (q = wxStrlen(nm)) - 1;
while (q-- && wxStrchr((wxChar *)trimchars, *s) != NULL)
*s = wxT('\0');
s = nm;
d = lnm;
#ifdef __WXMSW__
q = FALSE;
#else
q = nm[0] == wxT('\\') && nm[1] == wxT('~');
#endif
/* Expand inline environment variables */
#ifdef __VISAGECPP__
while (*d)
{
*d++ = *s;
if(*s == wxT('\\'))
{
*(d - 1) = *++s;
if (*d)
{
s++;
continue;
}
else
break;
}
else
#else
while ((*d++ = *s) != 0) {
# ifndef __WXMSW__
if (*s == wxT('\\')) {
if ((*(d - 1) = *++s)!=0) {
s++;
continue;
} else
break;
} else
# endif
#endif
// No env variables on WinCE
#ifndef __WXWINCE__
#ifdef __WXMSW__
if (*s++ == wxT('$') && (*s == wxT('{') || *s == wxT(')')))
#else
if (*s++ == wxT('$'))
#endif
{
register wxChar *start = d;
register int braces = (*s == wxT('{') || *s == wxT('('));
register wxChar *value;
while ((*d++ = *s) != 0)
if (braces ? (*s == wxT('}') || *s == wxT(')')) : !(wxIsalnum(*s) || *s == wxT('_')) )
break;
else
s++;
*--d = 0;
value = wxGetenv(braces ? start + 1 : start);
if (value) {
for ((d = start - 1); (*d++ = *value++) != 0;)
{
// Empty
}
d--;
if (braces && *s)
s++;
}
}
#endif
// __WXWINCE__
}
/* Expand ~ and ~user */
nm = lnm;
if (nm[0] == wxT('~') && !q)
{
/* prefix ~ */
if (nm[1] == SEP || nm[1] == 0)
{ /* ~/filename */
// FIXME: wxGetUserHome could return temporary storage in Unicode mode
if ((s = WXSTRINGCAST wxGetUserHome(wxEmptyString)) != NULL) {
if (*++nm)
nm++;
}
} else
{ /* ~user/filename */
register wxChar *nnm;
register wxChar *home;
for (s = nm; *s && *s != SEP; s++)
{
// Empty
}
int was_sep; /* MATTHEW: Was there a separator, or NULL? */
was_sep = (*s == SEP);
nnm = *s ? s + 1 : s;
*s = 0;
// FIXME: wxGetUserHome could return temporary storage in Unicode mode
if ((home = WXSTRINGCAST wxGetUserHome(wxString(nm + 1))) == NULL)
{
if (was_sep) /* replace only if it was there: */
*s = SEP;
s = NULL;
}
else
{
nm = nnm;
s = home;
}
}
}
d = buf;
if (s && *s) { /* MATTHEW: s could be NULL if user '~' didn't exist */
/* Copy home dir */
while (wxT('\0') != (*d++ = *s++))
/* loop */;
// Handle root home
if (d - 1 > buf && *(d - 2) != SEP)
*(d - 1) = SEP;
}
s = nm;
while ((*d++ = *s++) != 0)
{
// Empty
}
delete[] nm_tmp; // clean up alloc
/* Now clean up the buffer */
return wxRealPath(buf);
}
/* Contract Paths to be build upon an environment variable
component:
example: "/usr/openwin/lib", OPENWINHOME --> ${OPENWINHOME}/lib
The call wxExpandPath can convert these back!
*/
wxChar *
wxContractPath (const wxString& filename,
const wxString& WXUNUSED_IN_WINCE(envname),
const wxString& user)
{
static wxChar dest[_MAXPATHLEN];
if (filename.empty())
return (wxChar *) NULL;
wxStrcpy (dest, WXSTRINGCAST filename);
#ifdef __WXMSW__
wxUnix2DosFilename(dest);
#endif
// Handle environment
const wxChar *val;
#ifndef __WXWINCE__
wxChar *tcp;
if (!envname.empty() && (val = wxGetenv (WXSTRINGCAST envname)) != NULL &&
(tcp = wxStrstr (dest, val)) != NULL)
{
wxStrcpy (wxFileFunctionsBuffer, tcp + wxStrlen (val));
*tcp++ = wxT('$');
*tcp++ = wxT('{');
wxStrcpy (tcp, WXSTRINGCAST envname);
wxStrcat (tcp, wxT("}"));
wxStrcat (tcp, wxFileFunctionsBuffer);
}
#endif
// Handle User's home (ignore root homes!)
val = wxGetUserHome (user);
if (!val)
return dest;
const size_t len = wxStrlen(val);
if (len <= 2)
return dest;
if (wxStrncmp(dest, val, len) == 0)
{
wxStrcpy(wxFileFunctionsBuffer, wxT("~"));
if (!user.empty())
wxStrcat(wxFileFunctionsBuffer, (const wxChar*) user);
wxStrcat(wxFileFunctionsBuffer, dest + len);
wxStrcpy (dest, wxFileFunctionsBuffer);
}
return dest;
}
// Return just the filename, not the path (basename)
wxChar *wxFileNameFromPath (wxChar *path)
{
wxString p = path;
wxString n = wxFileNameFromPath(p);
return path + p.length() - n.length();
}
wxString wxFileNameFromPath (const wxString& path)
{
wxString name, ext;
wxFileName::SplitPath(path, NULL, &name, &ext);
wxString fullname = name;
if ( !ext.empty() )
{
fullname << wxFILE_SEP_EXT << ext;
}
return fullname;
}
// Return just the directory, or NULL if no directory
wxChar *
wxPathOnly (wxChar *path)
{
if (path && *path)
{
static wxChar buf[_MAXPATHLEN];
// Local copy
wxStrcpy (buf, path);
int l = wxStrlen(path);
int i = l - 1;
// Search backward for a backward or forward slash
while (i > -1)
{
#if defined(__WXMAC__) && !defined(__DARWIN__)
// Classic or Carbon CodeWarrior like
// Carbon with Apple DevTools is Unix like
if (path[i] == wxT(':') )
{
buf[i] = 0;
return buf;
}
#else
// Unix like or Windows
if (path[i] == wxT('/') || path[i] == wxT('\\'))
{
buf[i] = 0;
return buf;
}
#endif
#ifdef __VMS__
if (path[i] == wxT(']'))
{
buf[i+1] = 0;
return buf;
}
#endif
i --;
}
#if defined(__WXMSW__) || defined(__OS2__)
// Try Drive specifier
if (wxIsalpha (buf[0]) && buf[1] == wxT(':'))
{
// A:junk --> A:. (since A:.\junk Not A:\junk)
buf[2] = wxT('.');
buf[3] = wxT('\0');
return buf;
}
#endif
}
return (wxChar *) NULL;
}
// Return just the directory, or NULL if no directory
wxString wxPathOnly (const wxString& path)
{
if (!path.empty())
{
wxChar buf[_MAXPATHLEN];
// Local copy
wxStrcpy (buf, WXSTRINGCAST path);
int l = path.Length();
int i = l - 1;
// Search backward for a backward or forward slash
while (i > -1)
{
#if defined(__WXMAC__) && !defined(__DARWIN__)
// Classic or Carbon CodeWarrior like
// Carbon with Apple DevTools is Unix like
if (path[i] == wxT(':') )
{
buf[i] = 0;
return wxString(buf);
}
#else
// Unix like or Windows
if (path[i] == wxT('/') || path[i] == wxT('\\'))
{
// Don't return an empty string
if (i == 0)
i ++;
buf[i] = 0;
return wxString(buf);
}
#endif
#ifdef __VMS__
if (path[i] == wxT(']'))
{
buf[i+1] = 0;
return wxString(buf);
}
#endif
i --;
}
#if defined(__WXMSW__) || defined(__OS2__)
// Try Drive specifier
if (wxIsalpha (buf[0]) && buf[1] == wxT(':'))
{
// A:junk --> A:. (since A:.\junk Not A:\junk)
buf[2] = wxT('.');
buf[3] = wxT('\0');
return wxString(buf);
}
#endif
}
return wxEmptyString;
}
// Utility for converting delimiters in DOS filenames to UNIX style
// and back again - or we get nasty problems with delimiters.
// Also, convert to lower case, since case is significant in UNIX.
#if defined(__WXMAC__)
#if TARGET_API_MAC_OSX
#define kDefaultPathStyle kCFURLPOSIXPathStyle
#else
#define kDefaultPathStyle kCFURLHFSPathStyle
#endif
wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent )
{
CFURLRef fullURLRef;
fullURLRef = CFURLCreateFromFSRef(NULL, fsRef);
if ( additionalPathComponent )
{
CFURLRef parentURLRef = fullURLRef ;
fullURLRef = CFURLCreateCopyAppendingPathComponent(NULL, parentURLRef,
additionalPathComponent,false);
CFRelease( parentURLRef ) ;
}
CFStringRef cfString = CFURLCopyFileSystemPath(fullURLRef, kDefaultPathStyle);
CFRelease( fullURLRef ) ;
return wxMacCFStringHolder(cfString).AsString(wxLocale::GetSystemEncoding());
}
OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef )
{
OSStatus err = noErr ;
CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, wxMacCFStringHolder(path ,wxLocale::GetSystemEncoding() ) , kDefaultPathStyle, false);
if ( NULL != url )
{
if ( CFURLGetFSRef(url, fsRef) == false )
err = fnfErr ;
CFRelease( url ) ;
}
else
{
err = fnfErr ;
}
return err ;
}
wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname )
{
CFStringRef cfname = CFStringCreateWithCharacters( kCFAllocatorDefault,
uniname->unicode,
uniname->length );
return wxMacCFStringHolder(cfname).AsString() ;
}
wxString wxMacFSSpec2MacFilename( const FSSpec *spec )
{
FSRef fsRef ;
if ( FSpMakeFSRef( spec , &fsRef) == noErr )
{
return wxMacFSRefToPath( &fsRef ) ;
}
return wxEmptyString ;
}
void wxMacFilename2FSSpec( const wxString& path , FSSpec *spec )
{
OSStatus err = noErr ;
FSRef fsRef ;
wxMacPathToFSRef( path , &fsRef ) ;
err = FSRefMakeFSSpec( &fsRef , spec ) ;
}
#endif // __WXMAC__
void
wxDos2UnixFilename (wxChar *s)
{
if (s)
while (*s)
{
if (*s == _T('\\'))
*s = _T('/');
#ifdef __WXMSW__
else
*s = (wxChar)wxTolower (*s); // Case INDEPENDENT
#endif
s++;
}
}
void
#if defined(__WXMSW__) || defined(__OS2__)
wxUnix2DosFilename (wxChar *s)
#else
wxUnix2DosFilename (wxChar *WXUNUSED(s) )
#endif
{
// Yes, I really mean this to happen under DOS only! JACS
#if defined(__WXMSW__) || defined(__OS2__)
if (s)
while (*s)
{
if (*s == wxT('/'))
*s = wxT('\\');
s++;
}
#endif
}
// Concatenate two files to form third
bool
wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& file3)
{
#if wxUSE_FILE
wxFile in1(file1), in2(file2);
wxTempFile out(file3);
if ( !in1.IsOpened() || !in2.IsOpened() || !out.IsOpened() )
return false;
ssize_t ofs;
unsigned char buf[1024];
for( int i=0; i<2; i++)
{
wxFile *in = i==0 ? &in1 : &in2;
do{
if ( (ofs = in->Read(buf,WXSIZEOF(buf))) == wxInvalidOffset ) return false;
if ( ofs > 0 )
if ( !out.Write(buf,ofs) )
return false;
} while ( ofs == (ssize_t)WXSIZEOF(buf) );
}
return out.Commit();
#else
wxUnusedVar(file1);
wxUnusedVar(file2);
wxUnusedVar(file3);
return false;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?