1 // This is core/vul/vul_file.h
2 #ifndef vul_file_h_
3 #define vul_file_h_
4 //:
5 // \file
6 // \brief A collection of miscellaneous filesystem-type utilities
7 // \author Andrew W. Fitzgibbon, Oxford RRG
8 // \date   02 Nov 98
9 //
10 // \verbatim
11 //  Modifications
12 //   981102 AWF Initial version.
13 //   PDA (Manchester) 21/03/2001: Tidied up the documentation
14 //   Feb.2002 - Peter Vanroose - brief doxygen comment placed on single line
15 //   Jun.2003 - Ian Scott      - added support for '\' file separator to dos version
16 // \endverbatim
17 
18 #include <string>
19 #include <ctime>
20 #ifdef _MSC_VER
21 #  include <vcl_msvc_warnings.h>
22 #endif
23 #include <vxl_config.h>
24 //: A collection of miscellaneous filesystem-type utilities
25 //
26 struct vul_file
27 {
28   //: Return current working directory
29   static std::string get_cwd();
30 
31   //: change current working directory
32   static bool change_directory(char const* dirname);
change_directoryvul_file33   static bool change_directory(std::string const& dirname) {
34     return change_directory(dirname.c_str());
35   }
36 
37   //: Make a writable directory.
38   // You might imagine mkdir would be a better name,
39   // and then you might imagine a world w/out ms.
40   static bool make_directory(char const* filename);
make_directoryvul_file41   static bool make_directory(std::string const& filename) {
42     return make_directory(filename.c_str());
43   }
44 
45   //: Make a writable directory, including any necessary parents.
46   // Returns true if successful, or if the directory already exists.
47   static bool make_directory_path(char const* filename);
make_directory_pathvul_file48   static bool make_directory_path(std::string const& filename) {
49     return make_directory_path(filename.c_str());
50   }
51 
52   //: Return true iff filename is a directory.
53   static bool is_directory(char const* filename);
is_directoryvul_file54   static bool is_directory(const std::string& filename) {
55     return is_directory(filename.c_str());
56   }
57 
58 #if defined(_WIN32) && !defined(__CYGWIN__)
59   //: Return true iff filename is a drive, e.g., "c:" or "Z:".
60   static bool is_drive(char const* filename);
is_drivevul_file61   static bool is_drive(const std::string& filename) {
62     return is_drive(filename.c_str());
63   }
64 #endif
65 
66   //: Expand any leading ~ escapes in filename
67   static std::string expand_tilde(char const* filename);
expand_tildevul_file68   static std::string expand_tilde(std::string const& filename) {
69     return expand_tilde(filename.c_str());
70   }
71 
72   //: Return true iff filename exists.  It may be any sort of file.
73   static bool exists(char const* filename);
existsvul_file74   static bool exists(std::string const& filename) {
75     return exists(filename.c_str());
76   }
77 
78   //: Return size of vul_file
79   static unsigned long size(char const* filename);
sizevul_file80   static unsigned long size(std::string filename) { return size(filename.c_str()); }
81 
82   //: Return dirname
83   static std::string dirname(char const* filename);
dirnamevul_file84   static std::string dirname(std::string const& filename) {
85     return dirname(filename.c_str());
86   }
87 
88   //: Return extension (including the '.').
89   static std::string extension(char const* filename);
extensionvul_file90   static std::string extension(std::string const& filename) {
91     return extension( filename.c_str() );
92   }
93 
94   //: Return basename
95   // Only strip specified suffix.
96   static std::string basename(char const* filename, char const* suffix = nullptr);
97   static std::string basename(std::string const& filename, char const* suffix = nullptr) {
98     return basename(filename.c_str(), suffix );
99   }
100 
101   //: Strips away directory of the filename
102   static std::string strip_directory(char const* filename);
strip_directoryvul_file103   static std::string strip_directory(std::string const &filename)
104   { return strip_directory(filename.c_str()); }
105 
106   //: Strips away extension of the filename
107   static std::string strip_extension(char const* filename);
strip_extensionvul_file108   static std::string strip_extension(std::string const &filename)
109   { return strip_extension(filename.c_str()); }
110 
111   //: Delete 1 or more files using the Local OS preferred globbing.
112   // E.g. \c delete_file_glob("*"); will delete all the files in the
113   // current directory on most operating systems.
114   // \return true if successful.
115   static bool delete_file_glob(std::string const& file_glob);
delete_file_globvul_file116   static bool delete_file_glob(char const* file_glob)
117   { return delete_file_glob(std::string(file_glob)); }
118 
119 
120 #if defined(_WIN32) && VXL_USE_WIN_WCHAR_T
121 
122   //: Return current working directory
123   //  This function is provided as an overloading
get_cwdvul_file124   static std::string get_cwd(char* /*dummy*/)
125   { return get_cwd(); }
126 
127   //: Return current working directory
128   static std::wstring get_cwd(wchar_t* dummy);
129 
130   //: change current working directory
131   static bool change_directory(wchar_t const* dirname);
change_directoryvul_file132   static bool change_directory(std::wstring const& dirname) {
133     return change_directory(dirname.c_str());
134   }
135 
136   //: Make a writable directory.
137   // You might imagine mkdir would be a better name,
138   // and then you might imagine a world w/out ms.
139   static bool make_directory(wchar_t const* filename);
make_directoryvul_file140   static bool make_directory(std::wstring const& filename) {
141     return make_directory(filename.c_str());
142   }
143 
144   //: Make a writable directory, including any necessary parents.
145   // Returns true if successful, or if the directory already exists.
146   static bool make_directory_path(wchar_t const* filename);
make_directory_pathvul_file147   static bool make_directory_path(std::wstring const& filename) {
148     return make_directory_path(filename.c_str());
149   }
150 
151   //: Return true iff filename is a directory.
152   static bool is_directory(wchar_t const* filename);
is_directoryvul_file153   static bool is_directory(const std::wstring& filename) {
154     return is_directory(filename.c_str());
155   }
156 
157   //: Return true iff filename is a drive, e.g., "c:" or "Z:".
158   static bool is_drive(wchar_t const* filename);
is_drivevul_file159   static bool is_drive(const std::wstring& filename) {
160     return is_drive(filename.c_str());
161   }
162 
163   ////: Expand any leading ~ escapes in filename
expand_tildevul_file164   static std::wstring expand_tilde(wchar_t const* filename) {
165     // ~ meaningless on win32
166     return std::wstring(filename);
167   }
expand_tildevul_file168   static std::wstring expand_tilde(std::wstring const& filename) {
169     // ~ meaningless on win32
170     return filename;
171   }
172 
173   //: Return true iff filename exists.  It may be any sort of file.
174   static bool exists(wchar_t const* filename);
existsvul_file175   static bool exists(std::wstring const& filename) {
176     return exists(filename.c_str());
177   }
178 
179   ////: Return size of vul_file
180   //static unsigned long size(wchar_t const* filename);
181   //static unsigned long size(std::wstring filename) { return size(filename.c_str()); }
182 
183   //: Return dirname
184   static std::wstring dirname(wchar_t const* filename);
dirnamevul_file185   static std::wstring dirname(std::wstring const& filename) {
186     return dirname(filename.c_str());
187   }
188 
189   //: Return extension (including the '.').
190   static std::wstring extension(wchar_t const* filename);
extensionvul_file191   static std::wstring extension(std::wstring const& filename) {
192     return extension( filename.c_str() );
193   }
194 
195   //: Return basename
196   static std::wstring basename(wchar_t const* filename, wchar_t const* suffix = 0);
197   static std::wstring basename(std::wstring const& filename, wchar_t const* suffix = 0) {
198     return basename(filename.c_str(), suffix );
199   }
200 
201   //: Strips away directory of the filename
202   static std::wstring strip_directory(wchar_t const* filename);
strip_directoryvul_file203   static std::wstring strip_directory(std::wstring const &filename)
204   { return strip_directory(filename.c_str()); }
205 
206   //: Strips away extension of the filename
207   static std::wstring strip_extension(wchar_t const* filename);
strip_extensionvul_file208   static std::wstring strip_extension(std::wstring const &filename)
209   { return strip_extension(filename.c_str()); }
210 
211 #endif
212 
213   static std::time_t time_modified(char const* filename);
time_modifiedvul_file214   static std::time_t time_modified(std::string const& filename) {
215     return time_modified(filename.c_str());
216   }
217 
218 };
219 
vul_file_exists(char const * f)220 inline bool vul_file_exists(char const *f) { return vul_file::exists(f); }
vul_file_exists(std::string f)221 inline bool vul_file_exists(std::string  f) { return vul_file::exists(f); }
222 
vul_file_is_directory(char const * f)223 inline bool vul_file_is_directory(char const *f) { return vul_file::is_directory(f); }
vul_file_is_directory(std::string f)224 inline bool vul_file_is_directory(std::string  f) { return vul_file::is_directory(f); }
225 
vul_file_size(char const * f)226 inline unsigned long vul_file_size(char const *f) { return vul_file::size(f); }
vul_file_size(std::string f)227 inline unsigned long vul_file_size(std::string  f) { return vul_file::size(f); }
228 
vul_file_extension(char const * f)229 inline std::string vul_file_extension(char const *f) { return vul_file::extension(f); }
vul_file_extension(std::string f)230 inline std::string vul_file_extension(std::string  f) { return vul_file_extension(f.c_str()); }
231 
232 #endif // vul_file_h_
233