删除多个文件时,我们是否必须检查每个文件是否存在?

时间:2016-05-20 12:51:04

标签: c# asp.net .net-4.5

在下面的代码中,我通过仅检查单个文件夹来检查文件是否上传,但是我注意到如果文件/new/name.ext不存在则代码会停止。

我们是否必须检查每个代码? 有没有办法继续使用代码而无需检查每个文件是否存在文件 - 或者更简单?

   if (System.IO.File.Exists(HttpContext.Current.Server.MapPath("/products/cats/thumb/" + strGuid  + strExt))) {
       System.IO.File.Delete(HttpContext.Current.Server.MapPath("/products/cats/icons/" + strGuid  + strExt));
       System.IO.File.Delete(HttpContext.Current.Server.MapPath("/products/cats/thumb/" + strGuid  + strExt));
       System.IO.File.Delete(HttpContext.Current.Server.MapPath("/products/cats/new/" + strGuid + strExt));
       System.IO.File.Delete(HttpContext.Current.Server.MapPath("/products/cats/large/" + strGuid  + strExt));
       System.IO.File.Delete(HttpContext.Current.Server.MapPath("/products/cats/full/" + strGuid + strExt));
   }

3 个答案:

答案 0 :(得分:1)

虽然我通常不会推荐"吃"例外,这可能是该例外规则的例外。

我写了一个方法:

void DeleteFile(string filePath)
{
    try
    {
         if(File.Exists(filePath)
         {
             File.Delete(filePath);
         }
    }
    catch(DirectoryNotFoundException ex)
    {
         // depending on your environment you might
         // be prompted for some comment to indicate
         // that you meant to do this because
         // it's usually bad.
    }        
}

只抓住DirectoryNotFoundException。如果目录不存在则文件不存在。

将其放在单独的方法中的原因是因为如果您关注这种情况,那么您不希望一个Delete抛出异常,以防止后续删除执行。

当我有另一种检查方式时,对我来说,使用异常处理并不完全适合我。验证文件是否存在更好。这只是极端的偏执狂。

这是一个问题 - 在删除之前,删除这些文件和目录的可能性有多大?如果一个文件抛出一个阻止其他文件被删除的异常,后果有多严重?最好只允许删除失败然后获得额外的偏执并且过度检查异常处理。但它是一种简短的方法,所以如果你担心它,它就会受到伤害。但是这种事情可能会形成习惯。

答案 1 :(得分:0)

难道你不能遍历文件夹..cats /及其子文件夹中的所有文件,并使用正确的属性(名称/扩展名)吗?然后你可以使用System.IO.File.Exists()。

if (System.IO.File.Exists(Path/to/file.ext)){
    System.IO.File.Delete(Path/to/file.ext);
}

可以使用

查找所有文件进行迭代
string[] files = Directory.GetFiles(txtFolderPath.Text, "*ProfileHandler.cs", SearchOption.AllDirectories);

然后做一些像:

foreach(file in files){
if (System.IO.File.Exists(Path/to/file.ext)){
        System.IO.File.Delete(Path/to/file.ext);
    }

}

E:很抱歉无法提供确切的语法,目前使用没有正确IDE的计算机来编写和测试代码。

答案 2 :(得分:0)

基于UweKeim建议和他在评论中提到的ZetaLongPaths library的来源(感谢你),因为我不需要所有长文件名/路径问题,所以我选择了几件可以处理我的小应用程序。我没有完全测试它,但它适用于我的问题中的代码。希望有人可以检查并提供更好的测试代码。

  using System;
  using System.ComponentModel;
  using System.Diagnostics;
  using System.IO;
  using System.Web.UI;
  using System.Web.UI.HtmlControls;


  //------------------------------------------------------------------------------
  // ZetaLongPaths/Source/Runtime/ZlpSafeFileOperations.cs 
  // https://github.com/UweKeim/ZetaLongPaths/blob/master/Source/Runtime/ZlpSafeFileOperations.cs#L30
  //------------------------------------------------------------------------------

  namespace MyNameSpace {

      public class FileHandling {


          //------------------------------------------------------------------------------
          ///<summary>
          /// Simple File Operations Handling 
          ///</summary>
          ///<remarks>
          /// 
          ///</remarks>
          //------------------------------------------------------------------------------


          public static bool SafeFileExists(FileInfo filePath) {
              return filePath != null && SafeFileExists(filePath.FullName);
          }

          public static bool SafeFileExists(string filePath) {
              return !string.IsNullOrEmpty(filePath) && System.IO.File.Exists(filePath);
          }
          public static void SafeMoveFile(FileInfo sourcePath, FileInfo dstFilePath) {
              SafeMoveFile(
                  sourcePath?.FullName.ToString(),
                  dstFilePath?.FullName);
          }
          public static void SafeDeleteFile(FileInfo filePath) {
              if (filePath != null) {
                  SafeDeleteFile(filePath.FullName);
              }
          }

          public static void SafeDeleteFile(
              string filePath) {
              Trace.TraceInformation(@"About to safe-delete file '{0}'.", filePath);

              if (!string.IsNullOrEmpty(filePath) && SafeFileExists(filePath)) {
                  try {
                      var attributes = System.IO.File.GetAttributes(filePath);

                      // Remove read-only attributes.
                      if ((attributes & FileAttributes.ReadOnly) != 0) {
                          System.IO.File.SetAttributes(
                              filePath,
                              attributes & (~(FileAttributes.ReadOnly)));
                      }

                      System.IO.File.Delete(filePath);
                  } catch (UnauthorizedAccessException x) {
                      var newFilePath =
                          $@"{filePath}.{Guid.NewGuid():N}.deleted";

                      Trace.TraceWarning(@"Caught UnauthorizedAccessException while deleting file '{0}'. " +
                                         @"Renaming now to '{1}'. {2}", filePath, newFilePath, x.Message);

                      try {
                          System.IO.File.Move(
                              filePath,
                              newFilePath);
                      } catch (Win32Exception x2) {
                          Trace.TraceWarning(@"Caught IOException while renaming upon failed deleting file '{0}'. " +
                                             @"Renaming now to '{1}'. {2}", filePath, newFilePath, x2.Message);
                      }
                  } catch (Win32Exception x) {
                      var newFilePath =
                          $@"{filePath}.{Guid.NewGuid():N}.deleted";

                      Trace.TraceWarning(@"Caught IOException while deleting file '{0}'. " +
                                         @"Renaming now to '{1}'. {2}", filePath, newFilePath, x.Message);

                      try {
                          System.IO.File.Move(
                              filePath,
                              newFilePath);
                      } catch (Win32Exception x2) {
                          Trace.TraceWarning(@"Caught IOException while renaming upon failed deleting file '{0}'. " +
                                             @"Renaming now to '{1}'. {2}", filePath, newFilePath, x2.Message);
                      }
                  }
              } else {
                  Trace.TraceInformation(@"Not safe-deleting file '{0}', " +
                                         @"because the file does not exist.", filePath);
              }
          }
          public static void SafeMoveFile(string sourcePath, string dstFilePath) {
              Trace.TraceInformation(@"About to safe-move file from '{0}' to '{1}'.", sourcePath, dstFilePath);

              if (sourcePath == null || dstFilePath == null) {
                  Trace.TraceInformation(
                      string.Format(
                          @"Source file path or destination file path does not exist. " +
                          @"Not moving."
                          ));
              } else {
                  if (SafeFileExists(sourcePath)) {
                      SafeDeleteFile(dstFilePath);

                      var d = Path.GetDirectoryName(dstFilePath);

                      if (!System.IO.Directory.Exists(d)) {
                          Trace.TraceInformation(@"Creating non-existing folder '{0}'.", d);
                          System.IO.Directory.CreateDirectory(d);
                      }

                      System.IO.File.Move(sourcePath, dstFilePath);
                  } else {
                      Trace.TraceInformation(@"Source file path to move does not exist: '{0}'.", sourcePath);
                  }
              }
          }

      }
  }

然后用

进行测试
   if (MyNameSpace.FileHandling.SafeFileExists(HttpContext.Current.Server.MapPath("/products/cats/thumb/" + strGuid  + strExt))) {

      MyNameSpace.FileHandling.SafeDeleteFile(HttpContext.Current.Server.MapPath("/products/cats/icons/" + strGuid  + strExt).ToString());
      MyNameSpace.FileHandling.SafeDeleteFile(HttpContext.Current.Server.MapPath("/products/cats/thumb/" + strGuid  + strExt).ToString());
      MyNameSpace.FileHandling.SafeDeleteFile(HttpContext.Current.Server.MapPath("/products/cats/new/" + strGuid + strExt).ToString());
      MyNameSpace.FileHandling.SafeDeleteFile(HttpContext.Current.Server.MapPath("/products/cats/large/" + strGuid  + strExt).ToString());
      MyNameSpace.FileHandling.SafeDeleteFile(HttpContext.Current.Server.MapPath("/products/cats/full/" + strGuid + strExt).ToString());

   }