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