【问题标题】:Unhandled Exception with File.Move - File Already ExistsFile.Move 未处理的异常 - 文件已存在
【发布时间】:2017-04-25 13:39:17
【问题描述】:

我面临一个应用程序执行某些过程然后将文件移动到新目录的挑战。它工作正常,但如果找到同名文件,我会得到一个未处理的异常。

如果文件已经存在,我不想覆盖它,也不想给用户一个消息。如果文件已经存在,我想将文件移动到 NewDirectory 并用不同的名称重命名文件。

我尝试的解决方案永远不会捕获未处理的异常。

string NewDirectory = (@"D:\Files\edited\");
Directory.CreateDirectory(NewDirectory);
string seconds = DateTime.Now.ToString("-ss");
string NewName = "Example Txt" + "-2.2-";
string FullPath = (NewDirectory + NewName + ".txt");

if (File.Exists(FullPath))
{
    File.Move(file, NewDirectory + NewName + seconds + ".txt");
    Console.WriteLine(NewName + seconds);
}
else
    File.Move(file, NewDirectory + NewName + ".txt");

Console.WriteLine(NewName);

screenshot for exception

【问题讨论】:

  • 如果文件已经存在,你想采取什么行动?覆盖它?
  • 不,我已经在我的问题中解释过,我想附加新文件名以避免异常。
  • 你对错误处理了解多少?
  • 你知道try/catch吗?
  • 秒可能是一个糟糕的选择。它们只有 60 个,每分钟重复一次。老实说,我会使用一个简单的 int,并在文件存在时在 while 循环中递增它。一旦文件不存在,将其添加到文件名并移动它(不要忘记 ToString)。

标签: c#


【解决方案1】:

您可以尝试使用随机名称创建目录。为此,请使用 Path.GetRandomFileName()。然后用一段时间检查文件是否存在。我也意识到如果文件不存在,您也会移动文件。是对的吗?也许这是你的问题

这是生成文件名的代码:

string NewName = Path.GetRandomFileName() + ".txt";
string FullName = Path.Combine(NewDirectory, NewName);

也最好使用 Path.Combine() 方法来创建路径。

【讨论】:

  • 我不想得到一个随机的名称,整个应用程序的创建是为了读取文本文件中的数据并根据每个文件中的特定字符串命名文件。你能告诉我为什么最好使用'string FullName = Path.Combine(NewDirectory, NewName);'比 'string FullName = (NewDirectory + NewName + ".txt");' ?
  • Path.Combines 方法检查分隔符是否存在,因此它不会重复分隔符以及路径是否包含无效字符。它只是更漂亮。串联字符串不是真正的问题
【解决方案2】:

您可能正在尝试创建已经存在的文件,因为您使用秒来追加。根据您调用它的频率,您可能正在尝试创建两个具有相同名称的文件。我会尝试使用完整的 DateTime 参考,或附加的任意递增数字。

此外,在连接文件路径时始终建议使用Path.Combine():尝试示例:

string NewDirectory = (@"D:\Files\edited\");
Directory.CreateDirectory(NewDirectory);
string seconds = DateTime.Now.ToString("-ss");
string NewName = "Example Txt" + "-2.2-.txt";
string FullPath = Path.Combine(NewDirectory, NewName);

if (File.Exists(FullPath))
{
  NewName = NewName + _SomeClassInteger + ".txt"
  File.Move(file, Path.Combine(NewDirectory, NewName));
  Console.WriteLine(NewName + seconds);
}
else
  File.Move(file, FullPath);

Console.WriteLine(NewName);

【讨论】:

  • 问题是,在我的调试和试验过程中,是的,文件名可能存在,但是使用其中的“-ss”,它不存在并且我目视检查,但是直到出现异常可以你解释什么是“_SomeClassInteger”以及“Path.Combine”的好处是什么?
  • Path.Combine 只是您喜欢的“安全”事物 - 您将始终获得有效的路径(防止丢失“/”或加倍等)。在您的示例中,它可能没有什么不同,这只是一种很好的做法。 _SomeClassInteger 只是任意的(例如在类级别设置的 int ) - 只是名称应该附加一个唯一的数字 - 比秒(只有 60 个值)更不可能引起冲突。不过我很感兴趣 - 稍后我会在我的系统上正确查看一下,看看我是否可以复制你的问题,你如何描述它:-)
【解决方案3】:

不幸的是,我仍然遇到异常。

我决定将“DateTime.Now.ToString("-ss")”添加到名称步骤中以避免出现异常,或者至少降低获取文件已存在的概率

string NewDirectory = (@"D:\Files\edited\");
Directory.CreateDirectory(NewDirectory);
string seconds = DateTime.Now.ToString("- ss");
string NewName = "Example Txt" + "-2.2-" + seconds;
    File.Move(file, NewDirectory + NewName + ".txt");
    Console.WriteLine(NewName);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多