(file) Return to FileSystem.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  1 karl  1.46 //%2003////////////////////////////////////////////////////////////////////////
  2 mike  1.28 //
  3 karl  1.46 // Copyright (c) 2000, 2001, 2002  BMC Software, Hewlett-Packard Development
  4            // Company, L. P., IBM Corp., The Open Group, Tivoli Systems.
  5            // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.;
  6            // IBM Corp.; EMC Corporation, The Open Group.
  7 mike  1.28 //
  8            // Permission is hereby granted, free of charge, to any person obtaining a copy
  9 kumpf 1.34 // of this software and associated documentation files (the "Software"), to
 10            // deal in the Software without restriction, including without limitation the
 11            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 12 mike  1.28 // sell copies of the Software, and to permit persons to whom the Software is
 13            // furnished to do so, subject to the following conditions:
 14            // 
 15 kumpf 1.34 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 16 mike  1.28 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 17            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 18 kumpf 1.34 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 19            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 20            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 21 mike  1.28 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 22            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 23            //
 24            //==============================================================================
 25            //
 26            // Author: Mike Brasher (mbrasher@bmc.com)
 27            //
 28            // Modified By:
 29 ramnath 1.29 //         Ramnath Ravindran(Ramnath.Ravindran@compaq.com)
 30 mike    1.28 //
 31              //%/////////////////////////////////////////////////////////////////////////////
 32              
 33              #include <iostream>
 34 konrad.r 1.48 //#include <cstdio>
 35 mike     1.28 #include <Pegasus/Common/Config.h>
 36               #include <Pegasus/Common/System.h>
 37               #include "Destroyer.h"
 38               #include "FileSystem.h"
 39               #include "Dir.h"
 40               
 41               PEGASUS_NAMESPACE_BEGIN
 42               
 43               // Clone the path as a C String but discard trailing slash if any:
 44               
 45 kumpf    1.38 static CString _clonePath(const String& path)
 46 mike     1.28 {
 47 kumpf    1.38     String clone = path;
 48 mike     1.28 
 49 kumpf    1.38     if (clone.size() && clone[clone.size()-1] == '/')
 50                       clone.remove(clone.size()-1);
 51 mike     1.28 
 52 kumpf    1.38     return clone.getCString();
 53 mike     1.28 }
 54               
 55               Boolean FileSystem::exists(const String& path)
 56               {
 57 kumpf    1.38     return System::exists(_clonePath(path));
 58 mike     1.28 }
 59               
 60               Boolean FileSystem::getCurrentDirectory(String& path)
 61               {
 62                   path.clear();
 63                   char tmp[4096];
 64               
 65                   if (!System::getCurrentDirectory(tmp, sizeof(tmp) - 1))
 66               	return false;
 67               
 68                   path.append(tmp);
 69                   return true;
 70               }
 71               
 72               Boolean FileSystem::existsNoCase(const String& path, String& realPath)
 73               {
 74 chuck    1.41 #ifdef PEGASUS_OS_OS400
 75                   // The OS/400 file system is case insensitive, so just call exists( ).
 76                   // This is faster, but the main reason to do this is to
 77                   // avoid multi-threading problems with the IFS directory APIs
 78                   // (even though they claim to be threadsafe).
 79                   realPath = path;
 80                   return exists(path);
 81               #else
 82 mike     1.28     realPath.clear();
 83 kumpf    1.38     CString cpath = _clonePath(path);
 84                   const char* p = cpath;
 85 mike     1.28 
 86                   const char* dirPath;
 87 kumpf    1.38     const char* fileName;
 88 kumpf    1.39     char* slash = (char *) strrchr(p, '/');
 89 mike     1.28 
 90                   if (slash)
 91                   {
 92               	*slash = '\0';
 93               	fileName = slash + 1;
 94               	dirPath = p;
 95               
 96               	if (*fileName == '\0')
 97               	    return false;
 98                   }
 99                   else
100                   {
101               	fileName = p;
102               	dirPath = ".";
103                   }
104               
105               
106                   for (Dir dir(dirPath); dir.more(); dir.next())
107                   {
108 kumpf    1.40 	if (System::strcasecmp(fileName, dir.getName()) == 0)
109 mike     1.28 	{
110               	    if (strcmp(dirPath, ".") == 0)
111               		realPath = dir.getName();
112               	    else
113               	    {
114               		realPath = dirPath;
115 kumpf    1.37 		realPath.append('/');
116               		realPath.append(dir.getName());
117 mike     1.28 	    }
118               	    return true;
119               	}
120                   }
121               
122                   return false;
123 chuck    1.41 #endif
124 mike     1.28 }
125               
126               Boolean FileSystem::canRead(const String& path)
127               {
128 kumpf    1.38     return System::canRead(_clonePath(path));
129 mike     1.28 }
130               
131               Boolean FileSystem::canWrite(const String& path)
132               {
133 kumpf    1.38     return System::canWrite(_clonePath(path));
134 mike     1.28 }
135               
136               Boolean FileSystem::getFileSize(const String& path, Uint32& size)
137               {
138 kumpf    1.38     return System::getFileSize(_clonePath(path), size);
139 mike     1.28 }
140               
141               Boolean FileSystem::removeFile(const String& path)
142               {
143 kumpf    1.38     return System::removeFile(_clonePath(path));
144 mike     1.28 }
145               
146               void FileSystem::loadFileToMemory(
147                   Array<Sint8>& array,
148                   const String& fileName)
149               {
150                   Uint32 fileSize;
151               
152                   if (!getFileSize(fileName, fileSize))
153               	throw CannotOpenFile(fileName);
154               
155 kumpf    1.38     FILE* fp = fopen(fileName.getCString(), "rb");
156 mike     1.28 
157                   if (fp == NULL)
158               	throw CannotOpenFile(fileName);
159               
160 kumpf    1.36     array.reserveCapacity(fileSize);
161 mike     1.28     char buffer[4096];
162                   size_t n;
163               
164                   while ((n = fread(buffer, 1, sizeof(buffer), fp)) > 0)
165                       array.append(buffer, n);
166               
167                   fclose(fp);
168               }
169               
170               Boolean FileSystem::compareFiles(
171                   const String& path1,
172                   const String& path2)
173               {
174                   Uint32 fileSize1;
175               
176                   if (!getFileSize(path1, fileSize1))
177               	throw CannotOpenFile(path1);
178               
179                   Uint32 fileSize2;
180               
181                   if (!getFileSize(path2, fileSize2))
182 mike     1.28 	throw CannotOpenFile(path2);
183               
184                   if (fileSize1 != fileSize2)
185               	return false;
186               
187 kumpf    1.38     FILE* fp1 = fopen(path1.getCString(), "rb");
188 mike     1.28 
189                   if (fp1 == NULL)
190               	throw CannotOpenFile(path1);
191               
192 kumpf    1.38     FILE* fp2 = fopen(path2.getCString(), "rb");
193 mike     1.28 
194                   if (fp2 == NULL)
195                   {
196               	fclose(fp1);
197               	throw CannotOpenFile(path2);
198                   }
199               
200                   int c1;
201                   int c2;
202               
203                   while ((c1 = fgetc(fp1)) != EOF && (c2 = fgetc(fp2)) != EOF)
204                   {
205               	if (c1 != c2)
206               	{
207               	    fclose(fp1);
208               	    fclose(fp2);
209               	    return false;
210               	}
211                   }
212               
213                   fclose(fp1);
214 mike     1.28     fclose(fp2);
215                   return true;
216               }
217               
218               Boolean FileSystem::renameFile(
219                   const String& oldPath,
220                   const String& newPath)
221               {
222 kumpf    1.38     return System::renameFile(oldPath.getCString(), newPath.getCString());
223 mike     1.28 }
224               
225 mike     1.31 Boolean FileSystem::copyFile(
226                   const String& fromPath,
227                   const String& toPath)
228               {
229 kumpf    1.38     return System::copyFile(fromPath.getCString(), toPath.getCString());
230 mike     1.31 }
231               
232 mike     1.28 Boolean FileSystem::openNoCase(PEGASUS_STD(ifstream)& is, const String& path)
233               {
234                   String realPath;
235               
236                   if (!existsNoCase(path, realPath))
237               	return false;
238               
239 kumpf    1.38     is.open(_clonePath(realPath) PEGASUS_IOS_BINARY);
240 david    1.44 
241 mike     1.31     return !!is;
242               }
243               
244               Boolean FileSystem::openNoCase(
245                   PEGASUS_STD(fstream)& fs, 
246                   const String& path,
247                   int mode)
248               {
249                   String realPath;
250 ramnath  1.30 
251 mike     1.31     if (!existsNoCase(path, realPath))
252               	return false;
253 mday     1.43 #if defined(__GNUC__) && GCC_VERSION >= 30200
254                   fs.open(_clonePath(realPath), PEGASUS_STD(ios_base::openmode)(mode));
255               #else
256 david    1.44 #if defined(PEGASUS_OS_OS400)
257 david    1.45     fs.open(_clonePath(realPath), mode, PEGASUS_STD(_CCSID_T(1208)) );
258 david    1.44 #else
259 kumpf    1.38     fs.open(_clonePath(realPath), mode);
260 david    1.44 #endif
261 mday     1.43 #endif
262 mike     1.31     return !!fs;
263 mike     1.28 }
264               
265               Boolean FileSystem::isDirectory(const String& path)
266               {
267 kumpf    1.38     return System::isDirectory(_clonePath(path));
268 mike     1.28 }
269               
270               Boolean FileSystem::changeDirectory(const String& path)
271               {
272 kumpf    1.38     return System::changeDirectory(_clonePath(path));
273 mike     1.28 }
274               
275               Boolean FileSystem::makeDirectory(const String& path)
276               {
277 kumpf    1.38     return System::makeDirectory(_clonePath(path));
278 mike     1.28 }
279               
280               Boolean FileSystem::removeDirectory(const String& path)
281               {
282 kumpf    1.38     return System::removeDirectory(_clonePath(path));
283 mike     1.28 }
284               
285               Boolean FileSystem::removeDirectoryHier(const String& path)
286               {
287                   Array<String> fileList;
288               
289                   // Get contents of current directory
290               
291                   if (!FileSystem::getDirectoryContents(path,fileList))
292               	return false;
293               
294                   // for files-in-directory, delete or recall removedir
295               
296                   for (Uint32 i = 0, n = fileList.size(); i < n; i++)
297                   {   
298               	String newPath = path;	 // extend path	to subdir
299               	newPath.append("/");
300               	newPath.append(fileList[i]);
301               	
302               	if (FileSystem::isDirectory(newPath))
303               	{
304 mike     1.28 	    // Recall ourselves with extended path
305               	    if (!FileSystem::removeDirectoryHier(newPath))
306               		return false; 
307               	}
308               
309               	else
310               	{
311                         if (!FileSystem::removeFile(newPath))
312               		return false;
313               	}
314                   }
315               
316                   return removeDirectory(path);	
317               }
318               
319               //
320               //  Get the file list in the directory into the
321               //  array of strings provided
322               //  @return The function should return false under these circumstances:
323               //
324               //
325 mike     1.28 //  1. The directory does not exist.
326               //  2. The file exists but is not a directory.
327               //  3. The directory is inaccessible.
328               //
329               //
330               Boolean FileSystem::getDirectoryContents(
331                   const String& path,
332                   Array<String>& paths)
333               {
334                   paths.clear();
335               
336                   try
337                   { 
338               	for (Dir dir(path); dir.more(); dir.next())
339               	{
340               	    String name = dir.getName();
341               
342               	    if (String::equal(name, ".") || String::equal(name, ".."))
343               		continue;
344               
345               	    paths.append(name);
346 mike     1.28 	}
347               	return true;
348                   }
349               
350                   // Catch the Dir exception
351                   catch(CannotOpenDirectory&)
352                   {
353                   	return false;
354                   }
355               }
356               
357               Boolean FileSystem::isDirectoryEmpty(const String& path)
358               {
359                   for (Dir dir(path); dir.more(); dir.next())
360                   {
361                       const char* name = dir.getName();
362               
363                       if (strcmp(name, ".") != 0 && strcmp(name, "..") != 0)
364                           return false;
365                   }
366               
367 mike     1.28     return true;
368               }
369               
370               void FileSystem::translateSlashes(String& path)
371               {
372 kumpf    1.35     for (Uint32 i = 0; i < path.size(); i++)
373 mike     1.28     {
374 kumpf    1.35 	if (path[i] == '\\')
375               	    path[i] = '/';
376 mike     1.28     }
377               }
378               
379 tony     1.42 // Return the just the base name from the path.
380               String  FileSystem::extractFileName(const String& path)
381               {
382                 char *p_path = new char[path.size() + 1];
383                 String basename = System::extract_file_name((const char *)path.getCString(), p_path);
384                 
385                 delete [] p_path;
386                 
387                 return basename;
388               }
389               
390               // Return just the path to the file or directory into path
391               String FileSystem::extractFilePath(const String& path)
392               {
393                 char *p_path = new char[path.size() + 1];
394                 String newpath = System::extract_file_path((const char *)path.getCString(), p_path);
395                 
396                 delete [] p_path;
397                 
398                 return newpath;
399               }
400 tony     1.42 
401 kumpf    1.47 // Changes file permissions on the given file.
402               Boolean FileSystem::changeFilePermissions(const String& path, mode_t mode)
403               {
404               #if defined(PEGASUS_OS_OS400)
405                   // ATTN: If getCString() is modified to return UTF8, then handle the 
406                   //       EBCDIC coversion in SystemUnix.cpp
407                   CString tempPath = path.getCString();
408               #else
409 david    1.49     CString tempPath = path.getCString();
410 kumpf    1.47 #endif
411               
412                   return System::changeFilePermissions(tempPath, mode);
413 konrad.r 1.48 }
414               
415               String FileSystem::getAbsoluteFileName(const String &paths, const String &filename) {
416               
417                 Uint32 pos =0;
418                 Uint32 token=0;
419                 String path = String::EMPTY;
420                 String root = String::EMPTY;
421                 String tempPath = paths;
422                 do {
423                   if (( pos = tempPath.find(FileSystem::getPathDelimiter())) == PEG_NOT_FOUND) {
424                               pos = tempPath.size();
425                               token = 0;
426                       }
427                       else {
428                               token = 1;
429                       }
430                       path = tempPath.subString(0, pos);
431                       tempPath.remove(0,pos+token);
432                       if (FileSystem::exists( path + "/" + filename ) == true) {
433               	  root = path + "/" + filename;
434 konrad.r 1.48 	  break;
435                       } else
436               	  {
437               	  //  cout << "File does not exist.\n";
438               	  }
439                 } while (tempPath.size() > 0);
440                 return root;
441 kumpf    1.47 }
442               
443 tony     1.42 
444 kumpf    1.33 Boolean GetLine(PEGASUS_STD(istream)& is, String& line)
445               {
446                   line.clear();
447               
448                   Boolean gotChar = false;
449                   char c;
450               
451                   while (is.get(c))
452                   {
453                       gotChar = true;
454               
455                       if (c == '\n')
456                           break;
457               
458                       line.append(c);
459                   }
460               
461                   return gotChar;
462               }
463               
464 mike     1.28 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2