FileInfo.MoveTo如果文件存在-重命名
本文关键字:重命名 存在 文件 MoveTo 如果 FileInfo | 更新日期: 2023-09-27 18:16:56
我有一个应用程序,可以将文件从一个目录移动到另一个目录,但有时会发生冲突,并且文件已经存在于目标目录中。
当这种情况发生时,我想用不同的名称移动文件——例如,如果文件名为test.txt
,我想将其命名为test.txt.1
。这没关系,但如果文件再次是test.txt
,但在目标文件夹中,我们有test.txt
和test.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
}
}
您可以使用这样的函数。。
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);
}