【发布时间】:2013-09-26 07:33:52
【问题描述】:
我正在使用 C# 在 Visual Studio 2010 中编写这个 Windows 窗体应用程序。
表单上有一个执行按钮,用户点击该按钮,程序会生成一些文件并存放在Output文件夹中(由程序使用Directory.CreateDirectory()创建)
我想创建一个存档文件夹来保存以前运行的输出文件。
在每次运行开始时,我尝试将现有的Output 文件夹移动到Archive 文件夹,然后创建一个新的Output 文件夹。下面是我运行的移动目录的函数。
static void moveToArchive()
{
if (!Directory.Exists("Archive")) Directory.CreateDirectory("Archive");
string timestamp = DateTime.Now.ToString("yyyyMMddHHmms");
try
{
Directory.Move("Output", "Archive\\" + timestamp);
}
catch(Exception e)
{
Console.WriteLine("Can not move folder: " + e.Message);
}
}
我遇到的问题让我很困惑......
有时我可以成功地将输出文件夹移动到存档,但有时会失败。
我从捕获异常中得到的错误消息是Access to path 'Output' is denied.
我检查了Output 文件夹中的所有文件都没有被使用。我不明白访问是如何被拒绝有时而不是所有时间的。
有人可以向我解释并告诉我如何解决问题吗?
--编辑--
在HansPassant注释之后,我稍微修改了函数以获取当前目录并使用完整路径。但是,我仍然遇到同样的问题。
函数现在看起来像这样:
static void moveToArchive()
{
string currentDir = Environment.CurrentDirectory;
Console.WriteLine("Current Directory = " + currentDir);
if (!Directory.Exists(currentDir + "\\Archive")) Directory.CreateDirectory(currentDir + "\\Archive");
string timestamp = DateTime.Now.ToString("yyyyMMddHHmms");
try
{
Directory.Move(currentDir + "\\Output", currentDir + "\\Archive\\" + timestamp);
}
catch(Exception e)
{
Console.WriteLine("Can not move folder: " + e.Message);
}
}
我打印出当前目录,它与我期望的一样,但我仍然无法使用完整路径。 Access to path 'C:\Users\Me\Desktop\FormApp\Output' is denied.
--编辑--
感谢大家的回答和评论。
我想你们中有些人会错过这部分,所以我要再强调一点。
Directory.Move() 有时有效,有时失败。
函数成功后,就没有问题了。 Output文件夹移动到Archive
当函数失败时,我得到的异常信息是Access to path denied.
【问题讨论】:
-
确保有“Output”文件夹且父目录中没有名为“Output”的文件(无文件扩展名)
-
@jgauffin 输出文件夹确实存在,并且其中没有任何文件被命名为输出。当 moveToArchive() 失败时,新生成的输出文件会在 Outuput 文件夹中创建,覆盖之前运行生成的文件。
-
此代码严重依赖于正确设置的 Environment.CurrentDirectory。总是出错,这是最糟糕的全局变量。始终使用完整路径名,例如 c:\foo\bar\baz。而且从不依赖于能够写入 c:\program 文件,UAC 阻止了这一点。
-
您是否在资源管理器窗口或命令提示符窗口中打开了该文件夹?
-
我猜生成文件的代码没有正确关闭它们。有时它可能会起作用,因为 GC 已经收集并完成了悬空文件句柄。在这种情况下,可能对写入文件的代码感兴趣。
标签: c# exception-handling directory access-denied