【问题标题】:File name change if exists in a folder in C#如果文件名存在于 C# 的文件夹中,则更改文件名
【发布时间】:2011-08-11 17:09:54
【问题描述】:

在我的应用程序中,我需要将文件(图像、pdf、txt)保存到文件夹中。 我需要将尽可能多的图像或文件添加到我的文件夹中。 假设我有一个名为“image1”的图像,如果它已经存在 在文件夹中,如果另一个用户尝试添加另一个具有该名称的图像 “image1”然后我的应用程序自动需要将 imagename 更改为“image2”。 所以应用程序应该检查文件是否存在,如果存在则保存 具有不同名称的新图像。 任何帮助将不胜感激。

【问题讨论】:

  • 您的问题是什么?你试过什么? “我需要在我的文件夹中添加尽可能多的图像或文件。”是什么意思?什么意思?
  • 如果文件名只是“image”,我猜你希望第二个命名为“image”?
  • 如果文件夹中存在一个名为“image1”的文件,而另一个用户想要添加另一个名为“image1”的图像,则应将新图像保存为“image2”。

标签: c# .net asp.net


【解决方案1】:

使用File.Exists 方法确定文件是否存在。

但是,必须注意冲突仍然可能发生。例如,存在竞争条件,即文件可能由其他人调用确定存在之后保存,但你调用创建文件之前,所以您仍然需要考虑错误。

您可能会考虑为每个保存(上传?)文件指定一个唯一名称,并在数据库中引用它们 - 在这种情况下,您可以非常可靠地使用 Guid.NewGuid

至于实际保存文件,您有很多选择:您可以使用FileStreamFile 类公开的静态方法或FileUpload 控件的方法(如果您正在使用它)。请说明您的情况。

最后,取决于那里的大小,如果数据库仍然在使用,您可能需要考虑将它们作为二进制数据存储在那里,那么名称冲突可能是无关紧要的。

【讨论】:

    【解决方案2】:

    当然,您可以使用System.IO.File.Exists(...) 检查文件是否存在,但我认为您的要求可能有点过于乐观了……您应该考虑多种情​​况。假设您有:

    upload.extension
    upload1.extension
    upload01.extension
    upload001.extension
    

    上面的名称表明您应该有一些命名约定,但该命名约定不会是通用的(除非您希望有一堆命名约定来涵盖所有这些情况)。如果用户想要保存一个名为“upload”的文件,并且您的命名约定表明文件名将增加一个没有前导数字的数字,那么您将尝试“upload1”,如果不可用,则使用“upload2”,直到您找到一个可用的。

    让我们用一个简单的例子来添加一个不带前导零的数字:

    int i = 0
    string fileExtension = ".extension";
    string availableFileName = fileName;
    while(System.IO.File.Exists(availableFileName+fileExtension))
    {
        availableFileName = fileName + i;
        i++;
    }
    fileUpload.SaveAs(availableFileName+fileExtension);
    

    这将在文件名末尾附加一个整数,直到找到不重复的文件名。

    【讨论】:

      【解决方案3】:

      你可以这样做......

       if (System.IO.File.Exists("Path"))
          {
              fileUpload1.SaveAs("Path + New FileName");
          }
      

      但是,如果您保存文件并附加当前数据时间和文件名会更好。例如

      fileUpload1.SaveAs("Path + Orginal FileName" + DateTime.Now.ToString("yyyy-MM-dd HHmmtt") + "File Extension";
      

      【讨论】:

        【解决方案4】:

        你应该可以使用System.IO.File.Exists来检查文件名是否已经存在...

        if(System.IO.File.Exists("image1")){
          //Use a different name
        }
        

        当然,您需要改进此示例,以便更灵活地满足您的特定需求。

        【讨论】:

          【解决方案5】:

          您可以使用System.IO.File.Exists[MSDN] 方法检查文件是否存在。它接受一个路径字符串作为它的参数。

          要在文件存在时操作路径字符串,请查看System.IO.Path[MSDN]。它是一个很好的实用程序,可以满足您的需要。

          【讨论】:

            【解决方案6】:

            我已经通过让任何上传的文件以 GUID 的字符串表示来命名成功地解决了这个问题。

            如果需要,您可以维护 GUID 生成的文件名和数据库中原始文件名之间的映射。

            或者直接使用这个:

                // Create a temporary file name to use for checking duplicates.
                string tempfileName = "";
            
                // Check to see if a file already exists with the
                // same name as the file to upload.        
                if (System.IO.File.Exists(pathToCheck)) 
                {
                  int counter = 2;
                  while (System.IO.File.Exists(pathToCheck))
                  {
                    // if a file with this name already exists,
                    // prefix the filename with a number.
                    tempfileName = counter.ToString() + fileName;
                    pathToCheck = savePath + tempfileName;
                    counter ++;
                  }
            
                  fileName = tempfileName;
            }
            

            来源:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.fileupload.saveas.aspx

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-07-17
              • 2017-04-12
              • 1970-01-01
              • 2014-05-18
              • 2018-11-12
              • 2012-05-01
              • 2018-07-28
              • 2017-04-16
              相关资源
              最近更新 更多