FileInfo.MoveTo如果文件存在-重命名

本文关键字:重命名 存在 文件 MoveTo 如果 FileInfo | 更新日期: 2023-09-27 18:16:56

我有一个应用程序,可以将文件从一个目录移动到另一个目录,但有时会发生冲突,并且文件已经存在于目标目录中。

当这种情况发生时,我想用不同的名称移动文件——例如,如果文件名为test.txt,我想将其命名为test.txt.1。这没关系,但如果文件再次是test.txt,但在目标文件夹中,我们有test.txttest.txt.1,下次该怎么做呢。

我的问题是,我找不到最后创建的文件,这样我就可以读取它的索引并用1递增。有什么建议吗?

string sourcePath = "C:''Files''test.txt";
string filename = Path.GetFileName(sourcePath);
string pathTo = "C:''Files''test''" + filename;
try
{
    var fileInfo = new FileInfo(sourcePath);
    fileInfo.MoveTo(pathTo);
}
catch (IOException ex)
{
    var fileInfo = new FileInfo(sourcePath);
    var file = Directory.GetFiles(pathTo, filename+".1").FirstOrDefault();
    if (file == null)
    {
        fileInfo.MoveTo(pathTo+".1");
    }
    else
    {
        //find the old file, read it's last index and increment it with 1
    }
}

FileInfo.MoveTo如果文件存在-重命名

您可以使用这样的函数。。

void MoveFileToPath(string sourceFilePath,string destinationDirectory)
    {
        int index = 1;
        string fileName = Path.GetFileName(sourceFilePath);
        string destPath = destinationDirectory+fileName;
        while(File.Exists(destPath))
        {
            destPath = string.Format("{0}{1}.{2}",destinationDirectory,fileName,index);
            index++;
        }
        var fileInfo = new FileInfo(sourceFilePath);
        Console.WriteLine("Test:"+destPath);
        fileInfo.MoveTo(destPath);
    }

我稍微重写了您的代码,因为您是针对异常进行编程的,这是我非常不鼓励的。

首先,它检查原始文件是否已经存在。

然后,作为原始代码,它尝试使用.1索引器创建文件。如果已经存在,它会遍历目录以查找具有相同文件名的所有文件。

最后,它查找最后使用的索引,并将其递增一。

请注意,您也可以跳过else语句中的第一个if语句,因为它仍将搜索最后使用的索引;如果不存在,lastIndex将保持为0(增量为1,因此它将使用1作为新文件的索引(。

var fileInfo = new FileInfo(sourcePath);
// Check if the file already exists.
if (!fileInfo.Exists)
    fileInfo.MoveTo(pathTo);
else
{
    var file = Directory.GetFiles(pathTo, filename + ".1").FirstOrDefault();
    if (file == null)
    {
        fileInfo.MoveTo(pathTo + ".1");
    }
    else
    {
        // Get all files with the same name.
        string[] getSourceFileNames = Directory.GetFiles(Path.GetDirectoryName(pathTo)).Where(s => s.Contains(filename)).ToArray();
        // Retrieve the last index.
        int lastIndex = 0;
        foreach (string s in getSourceFileNames)
        {
            int currentIndex = 0;
            int.TryParse(s.Split('.').LastOrDefault(), out currentIndex);
            if (currentIndex > lastIndex)
                lastIndex = currentIndex;
        }
        // Do something with the last index.
        lastIndex++;
        fileInfo.MoveTo(pathTo + lastIndex);
    }
}
Func<int, string> getFileName= delegate(int i) 
{
    return string.Format("{0}/{1}{2}.{3}", dir, filenameWithouExt, i, ext);
};
int i = 0;
while(File.Exists(getFileName(i)))
{
 i++;
}
fileInfo.MoveTo(getFileName(i));

这取决于你有多少文件。如果你有很多文件,你可以让它更快:

int i = 0;
while(File.Exists(getFileName(i)))
{
  i+=100;
}
i-=90;
while(File.Exists(getFileName(i)))
{
  i+=10;
}
i-=9;
while(File.Exists(getFileName(i)))
{
  i+=1;
}

我更喜欢写一个方法,它将返回文件的下一个索引并删除try-catch块:

string sourcePath = "C:''Files''test.txt";
string filename = Path.GetFileName(sourcePath);
string pathTo = "C:''Files''test''"; // the destination file name would be appended later
var fileInfo = new FileInfo(sourcePath);
if (!fileInfo.Exists)
{
    fileInfo.MoveTo(pathTo);
}
else
{
    // Get all files by mask "test.txt.*"
    var files = Directory.GetFiles(pathTo, string.Format("{0}.*", filename)).ToArray();
    var newExtension = GetNewFileExtension(files); // will return .1, .2, ... .N
    fileInfo.MoveTo(Path.Combine(pathTo, string.Format("{0}{1}", filename, newExtension)));
}

以及获取新索引的新方法:

public static string GetNewFileExtension(string[] fileNames) 
{
    int maxIndex = 0;
    foreach (var fileName in fileNames)
    {
        // get the file extension and remove the "."
        string extension = Path.GetExtension(fileName).Substring(1); 
        int parsedIndex;
        // try to parse the file index and do a one pass max element search
        if(int.TryParse(extension, out parsedIndex)) 
        {
            if(parsedIndex > maxIndex)
            {
                maxIndex = parsedIndex;
            }
        }
    }
    // increment max index by 1
    return string.Format(".{0}", maxIndex + 1); 
}