Unbreak VC++ build.
authorJeff Cohen <jeffc@jolt-lang.org>
Sat, 7 Apr 2007 20:47:27 +0000 (20:47 +0000)
committerJeff Cohen <jeffc@jolt-lang.org>
Sat, 7 Apr 2007 20:47:27 +0000 (20:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35751 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Win32/Path.inc
lib/System/Win32/Signals.inc

index 937bb51fa63adcc4a88191ed02deaf5777e6f8b4..f28fe86b59b444b023e6926107000d3addec8c3d 100644 (file)
@@ -368,11 +368,15 @@ bool Path::makeExecutableOnDisk(std::string* ErrMsg) {
 
 bool
 Path::getDirectoryContents(std::set<Path>& result, std::string* ErrMsg) const {
-  const FileStatus *Status = getFileStatus(false, ErrMsg);
-  if (!Status)
+  WIN32_FILE_ATTRIBUTE_DATA fi;
+  if (!GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &fi)) {
+    MakeErrMsg(ErrMsg, path + ": can't get status of file");
     return true;
-  if (!Status->isDir) {
-    MakeErrMsg(ErrMsg, path + ": not a directory");
+  }
+    
+  if (!(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    if (ErrMsg)
+      *ErrMsg = path + ": not a directory";
     return true;
   }
 
@@ -565,28 +569,11 @@ Path::createFileOnDisk(std::string* ErrMsg) {
 
 bool
 Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const {
-  const FileStatus *Status = getFileStatus(false, ErrStr);
-  if (!Status)
-    return false;
+  WIN32_FILE_ATTRIBUTE_DATA fi;
+  if (!GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &fi))
+    return true;
     
-  if (Status->isFile) {
-    DWORD attr = GetFileAttributes(path.c_str());
-
-    // If it doesn't exist, we're done.
-    if (attr == INVALID_FILE_ATTRIBUTES)
-      return false;
-
-    // Read-only files cannot be deleted on Windows.  Must remove the read-only
-    // attribute first.
-    if (attr & FILE_ATTRIBUTE_READONLY) {
-      if (!SetFileAttributes(path.c_str(), attr & ~FILE_ATTRIBUTE_READONLY))
-        return MakeErrMsg(ErrStr, path + ": Can't destroy file: ");
-    }
-
-    if (!DeleteFile(path.c_str()))
-      return MakeErrMsg(ErrStr, path + ": Can't destroy file: ");
-    return false;
-  } else if (Status->isDir) {
+  if (fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     // If it doesn't exist, we're done.
     if (!exists())
       return false;
@@ -645,9 +632,19 @@ Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const {
       return MakeErrMsg(ErrStr, 
         std::string(pathname) + ": Can't destroy directory: ");
     return false;
-  } 
-  // It appears the path doesn't exist.
-  return true;
+  } else {
+    // Read-only files cannot be deleted on Windows.  Must remove the read-only
+    // attribute first.
+    if (fi.dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
+      if (!SetFileAttributes(path.c_str(),
+                             fi.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY))
+        return MakeErrMsg(ErrStr, path + ": Can't destroy file: ");
+    }
+
+    if (!DeleteFile(path.c_str()))
+      return MakeErrMsg(ErrStr, path + ": Can't destroy file: ");
+    return false;
+  }
 }
 
 bool Path::getMagicNumber(std::string& Magic, unsigned len) const {
index 8adf7674faf387077162845395d567d9c7add8e2..7da0c751136714965ded07d038353ea1a3ea3a57 100644 (file)
@@ -101,12 +101,15 @@ bool sys::RemoveFileOnSignal(const sys::Path &Filename, std::string* ErrMsg) {
 // RemoveDirectoryOnSignal - The public API
 bool sys::RemoveDirectoryOnSignal(const sys::Path& path, std::string* ErrMsg) {
   // Not a directory?
-  const sys::FileStatus *Status =  path.getFileStatus(false, ErrMsg);
-  if (!Status)
+  WIN32_FILE_ATTRIBUTE_DATA fi;
+  if (!GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &fi)) {
+    MakeErrMsg(ErrMsg, path.toString() + ": can't get status of file");
     return true;
-  if (!Status->isDir) {
+  }
+    
+  if (!(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
     if (ErrMsg)
-      *ErrMsg = path.toString() + " is not a directory";
+      *ErrMsg = path.toString() + ": not a directory";
     return true;
   }