1

我是 C# 的初学者。在我的项目中,用户通过 OpenFileDialog 框选择一个图像文件。当他/她选择图像文件时,我正在运行如下代码:

File.Copy(SourceFilePath, DestinationFilePath);

上述代码的问题在于,每当用户尝试添加现有图像文件时,它都会引发错误。为避免此错误,我将代码更改为以下代码:

if (File.Exists(DestinationFilePath))
{
     intCount++;
     File.Copy(SourceFilePath,TemporaryFilePath);
     File.Copy(TemporaryFilePath, DestinationFilePath + intCount.ToString());
     File.Delete(TemporaryFilePath);                                
}
else
{
     File.Copy(SourceFilePath, DestinationFilePath);
}

上面代码中的问题是它intCount在图像文件的最后添加了值,就像image.gif1改变文件扩展名一样。如何在图像文件路径中添加计数器?

而且我认为我在这里用来检查现有文件的方法不是正确的做法。

更新:答案:-

        int intCount = 1;
        while (File.Exists(Application.StartupPath + DirectoryPath + strPath))
        {
            strPath = Path.GetFileNameWithoutExtension(strPath) + intLarge.ToString() + Path.GetExtension(strPath);
            intCount++;
        }
        intCount = 1;
4

5 回答 5

2
private string GetIndexedFilePath(string path, int index)
{
   var directoryName = Path.GetDirectoryName(path);
   var oldFileName = Path.GetFileNameWithoutExtension(path);
   var extension = Path.GetExtension(path);
   var indexedFileName = String.Format("{0}_{1}{2}", oldFileName, index, extension);
   return Path.Combine(directoryName, indexedFileName);
}

顺便说一句,在将文件重命名为“file_2.gif”之类的文件后,您仍然可能与目标目录中已经存在的文件发生名称冲突。

string destinationPath;
int index = 0;
do
{
    destinationPath = GetIndexedFilePath(path, ++index);
}
while(File.Exists(destinationPath));
// Copy file to destinationPath
于 2012-10-23T12:36:27.493 回答
1

采用

Path.GetFileNameWithoutExtension(string destinationfilename)

添加int到它并添加扩展名,你可以通过

Path.GetExtension(string destinationfilename)
于 2012-10-23T12:21:44.357 回答
1

代替:

DestinationFilePath + intCount.ToString()

您可以使用:

intCount.ToString() + DestinationFilePath

这会将它添加到开头,导致1image.gif.

于 2012-10-23T12:22:15.437 回答
1

最好的方法是只创建一个新的文件路径。

下面的函数将给 image.gif 计数为 1 为 image1.gif

private string GetIncrementedFilePath(string orginalFilePath, int count)
{
    var extension = Path.GetExtension(orginalFilePath);
    var fileName = Path.GetFileNameWithoutExtension(orginalFilePath);
    var directory = Path.GetDirectoryName(orginalFilePath);

    var newFullPath = string.Format("{0}\\{1}{2}{3}", directory, fileName, count, extension);

    return newFullPath;
}

请注意 Path.GetExension 会给你 '.gif' 而不是 'gif'

// Summary:
//     Returns the extension of the specified path string.
//
// Parameters:
//   path:
//     The path string from which to get the extension.
//
// Returns:
//     A System.String containing the extension of the specified path (including
//     the "."), null, or System.String.Empty. If path is null, GetExtension returns
//     null. If path does not have extension information, GetExtension returns Empty.
//
// Exceptions:
//   System.ArgumentException:
//     path contains one or more of the invalid characters defined in System.IO.Path.GetInvalidPathChars().
public static string GetExtension(string path);

如果您想知道文件是否存在,那么 .NET 中内置了一个函数来执行此操作。

// Summary:
//     Determines whether the specified file exists.
//
// Parameters:
//   path:
//     The file to check.
//
// Returns:
//     true if the caller has the required permissions and path contains the name
//     of an existing file; otherwise, false. This method also returns false if
//     path is null, an invalid path, or a zero-length string. If the caller does
//     not have sufficient permissions to read the specified file, no exception
//     is thrown and the method returns false regardless of the existence of path.
File.Exists(path);
于 2012-10-23T12:28:01.610 回答
1

您可以使用该类对包含文件或目录名称信息的实例Path执行操作,以将表示文件名的字符串与其扩展名分开System.String

例子

string Name = Path.GetFileNameWithoutExtension(DestinationFilePath); //Get the file name excluding its extension
string Extension = Path.GetExtension(DestinationFilePath); //Declare a new string representing the extension of the file
File.Copy(TemporaryFilePath,  DestinationFilePath.Replace(Path.GetFileName(DestinationFilePath), "") + Name + intCount.ToString() + Extension); //Copy from TemporaryFilePath to DestinationFilePath appending a number after the string then the Extension we gathered first

上面发布的示例会将 example 的文件名复制TemporaryFilePath\File_Name.(Extension)DestinationFilePath\File_Name (intCount).(Extension)where(intCount)表示数字并表示(Extension)文件的扩展名。因此,文件名的最终外观将如下所示 if intCountis equal to 1and the Extensionis.exe

  • DestinationFilePath\File_Name 1.exe

谢谢,
我希望你觉得这有帮助:)

于 2012-10-23T12:39:55.183 回答