Main Page Class Hierarchy Compound List File List Compound Members File Members

FileName.cc

Go to the documentation of this file.
00001 /*
00002 File: FileName.cc
00003 
00004 Function: Implements FileName.h
00005 
00006 Author: Andrew Willmott
00007 
00008 Notes: 
00009 */
00010 
00011 #include "cl/FileName.h"
00012 #include "cl/CLConfig.h"
00013 #include <stdio.h>
00014 #include <sys/stat.h>
00015 #include <stdlib.h>
00016 #include <unistd.h>
00017 
00018  Void FileName::RemoveExtension()
00019 {
00020 Int dotPos;
00021 
00022 dotPos = name.FindCharLast('.');
00023 
00024 if (dotPos >= 0)
00025 {
00026 extension = name.Suffix(-1 - dotPos);
00027 name = name.Prefix(dotPos);
00028 }
00029 else
00030 extension = "";
00031 }
00032 
00033  Void FileName::AddExtension(StrConst ext)
00034 {
00035 name = name + "." + extension;
00036 extension = ext;
00037 }
00038 
00039  String FileName::GetPath() const
00040 {
00041 String result;
00042 
00043 #ifdef CL_MACOS
00044 result.Printf("%s.%s", name.CString(), extension.CString());
00045 #else
00046 if (extension == "")
00047 result.Printf("%s/%s", path.CString(), name.CString());
00048 else
00049 result.Printf("%s/%s.%s", path.CString(), name.CString(), extension.CString());
00050 #endif
00051 
00052 return(result);
00053 }
00054 
00055  FileName &FileName::SetPath(StrConst filePath)
00056 {
00057 Int slashPos;
00058 TempString thePath = SubstituteEnvVars(filePath);
00059 
00060 slashPos = thePath.FindCharLast('/');
00061 
00062 if (slashPos >= 0)
00063 {
00064 path = thePath.Prefix(slashPos);
00065 name = thePath.Suffix(-1 - slashPos);
00066 }
00067 else
00068 {
00069 path = ".";
00070 name = thePath;
00071 }
00072 
00073 RemoveExtension();
00074 
00075 return(SELF);
00076 }
00077 
00078  FileName &FileName::SetRelPath(StrConst filePath)
00079 {
00080 Int slashPos;
00081 TempString thePath = SubstituteEnvVars(filePath);
00082 
00083 if (thePath[0] == '/')
00084 // absolute path
00085 return(SetPath(filePath));
00086 
00087 slashPos = thePath.FindCharLast('/');
00088 
00089 if (slashPos >= 0)
00090 {
00091 path = path + "/" + thePath.Prefix(slashPos);
00092 name = thePath.Suffix(-(slashPos + 1));
00093 }
00094 else
00095 name = thePath;
00096 
00097 RemoveExtension();
00098 
00099 return(SELF);
00100 }
00101 
00102  Bool FileName::Exists() const
00103 {
00104 return(access(GetPath().CString(), F_OK) == 0);
00105 }
00106 
00107  Bool FileName::IsReadable() const
00108 {
00109 return(access(GetPath().CString(), R_OK) == 0);
00110 }
00111 
00112  Bool FileName::IsWritable() const
00113 {
00114 return(access(GetPath().CString(), W_OK) == 0);
00115 }
00116 
00117  Long FileName::GetTimeStamp() const
00118 {
00119 struct stat statInfo;
00120 
00121 stat(GetPath().CString(), &statInfo);
00122 
00123 return(statInfo.st_mtime);
00124 }
00125 
00126  String TempPath()
00127 {
00128 String result = SubstituteEnvVars("$TMPDIR");
00129 
00130 if (result[0] == '<')
00131 result = "/tmp";
00132 
00133 return(result);
00134 }
00135 
00136  StrConst tCompressExtensions[] =
00137 {
00138 "gz",
00139 "bz2",
00140 "Z",
00141 0
00142 };
00143 
00144 
00145  Int FileName::FindFileExtension(StrConst extensions[], Bool allowCompressed)
00162 {
00163 Int i, j;
00164 Bool extWasSet;
00165 
00166 flags.Clear();
00167 
00168 extWasSet = (extension != "");
00169 
00170 if (extWasSet)
00171 // an extension is already set -- at most we might have to 
00172 // tack on a compression suffix.
00173 {
00174 // remove any compression suffix
00175 if (allowCompressed)
00176 for (j = 0; !tCompressExtensions[j].IsNull(); j++)
00177 if (extension == tCompressExtensions[j])
00178 {
00179 if (IsReadable())
00180 flags.Set(1 << j);
00181 RemoveExtension();
00182 break;
00183 }
00184 
00185 // check that the extension is valid
00186 for (i = 0; !extensions[i].IsNull(); i++)
00187 if (extension == extensions[i])
00188 break;
00189 
00190 if (extensions[i].IsNull())
00191 return(kBadExtension);
00192 
00193 if (flags.IsSet(FN_IsCompressed) || IsReadable())
00194 return(i);
00195 else
00196 {
00197 if (allowCompressed)
00198 // try it with a compression extension
00199 {
00200 AddExtension("");
00201 
00202 for (j = 0; !tCompressExtensions[j].IsNull(); j++)
00203 {
00204 SetExtension(tCompressExtensions[j]);
00205 
00206 if (IsReadable())
00207 {
00208 RemoveExtension();
00209 flags.Set(1 << j);
00210 
00211 return(i);
00212 }
00213 }
00214 
00215 RemoveExtension();
00216 }
00217 
00218 return(kFileNotFound);
00219 }
00220 }
00221 
00222 // try all possible extensions and compressions
00223 for (i = 0; !extensions[i].IsNull(); i++)
00224 {
00225 SetExtension(extensions[i]);
00226 
00227 if (IsReadable()) 
00228 return(i);
00229 
00230 // try it with a compression extension
00231 if (allowCompressed)
00232 {
00233 AddExtension("");
00234 
00235 for (j = 0; !tCompressExtensions[j].IsNull(); j++)
00236 {
00237 SetExtension(tCompressExtensions[j]);
00238 
00239 if (IsReadable())
00240 {
00241 RemoveExtension();
00242 flags.Set(1 << j);
00243 
00244 return(i);
00245 }
00246 }
00247 
00248 RemoveExtension();
00249 }
00250 }
00251 
00252 SetExtension("");
00253 
00254 return(kFileNotFound);
00255 }
00256 
00257  FileName &FileName::MakeUnique()
00258 {
00259 if (Exists())
00260 {
00261 String origName = name;
00262 Int i = 0;
00263 
00264 do
00265 {
00266 i++;
00267 name.Printf("%s-%d", origName.CString(), i);
00268 }
00269 while (Exists());
00270 }
00271 
00272 return(SELF);
00273 }
00274 
00275  Void FileName::AddCompExt()
00276 {
00277 if (flags.IsSet(FN_Gzipped))
00278 AddExtension("gz");
00279 else if (flags.IsSet(FN_Bz2ed))
00280 AddExtension("bz2");
00281 else if (flags.IsSet(FN_Compress))
00282 AddExtension("Z");
00283 }
00284 
00285  Int FileName::DecompressSetup()
00286 {
00287 if (flags.IsSet(FN_IsCompressed))
00288 {
00289 String origFile;
00290 StrConst cmd;
00291 Int err;
00292 
00293 AddCompExt();
00294 origFile = GetPath();
00295 RemoveExtension();
00296 SetDir(TempPath());
00297 
00298 if (flags.IsSet(FN_Gzipped))
00299 cmd = "gunzip -c";
00300 else if (flags.IsSet(FN_Bz2ed))
00301 cmd = "bunzip2 -c";
00302 else if (flags.IsSet(FN_Compress))
00303 cmd = "compress -c";
00304 
00305 if (system(cmd + " " + origFile + " > " + GetPath()) != 0)
00306 return(-1);
00307 }
00308 
00309 return(0);
00310 }
00311 
00312  Void FileName::DecompressCleanup()
00313 {
00314 if (flags.IsSet(FN_IsCompressed))
00315 unlink(GetPath());
00316 }

Generated at Sat Aug 5 00:16:31 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /