【发布时间】:2015-03-26 14:30:12
【问题描述】:
我有一个应用程序,它在生成文件后尝试使用 File.Move 函数将其从网络位置移动到本地文件夹。
File.Move(_backupSource + @"\" + filename, _backupDestination + @"\" + filename);
_backupSource 是网络位置,_backupDestintation 是本地文件夹。
文件复制到目标位置,几天后没有删除源上的文件,就像我使用 File.Copy 一样,但是这个应用程序现在工作了两个月了。
我也看了两台服务器的事件查看器,没有产生异常。
¿会发生什么?
编辑: 一件事可能很重要。此应用程序每晚由任务调度程序触发。如果我手动运行应用程序,文件将被移动(而不是复制)
编辑 2: 现在我尝试复制文件,然后使用以下方法删除文件
private static void MoveFiles(string filename)
{
FileInfo file = new FileInfo(_backupSource + @"\" + filename);
FileStream stream = null;
int iteration = 0;
file.CopyTo(_backupDestination + @"\" + filename);
bool isUnlocked = false;
while (!isUnlocked)
{
iteration++;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
isUnlocked = true;
}
catch (IOException ex)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
Thread.Sleep(60 * 1000);
if (iteration > 60)
throw ex;
else
EventLog.WriteEntry("DailyRestore", string.Format("Move File. Iteration number {0}", filename), EventLogEntryType.Information);
}
finally
{
if (stream != null)
stream.Close();
}
}
file.Delete();
}
在日志中可以看到应用程序每分钟尝试一个小时,并且文件始终“被另一个进程使用”。就像我提到的,这是在调度程序任务执行exe时,如果我手动运行执行exe的任务(右键单击并执行),则所有操作都成功结束。
【问题讨论】:
-
运行应用的账号在源文件夹中有删除权限吗?
-
是的,是域帐户,在两台服务器上都是管理员
-
也许某种授权/访问已经改变?如果您只想确保文件已消失,请使用 if(File.Exists(_backupSource + @"\" + filename)) { File.Delete(_backupSource + @"\" + filename); }
-
旁注:宁可使用Path.Combine 而不是与
+连接。 -
MSDN:如果您尝试跨磁盘卷移动文件并且该文件正在使用中,则该文件将复制到目标位置,但不会从源中删除。
标签: c# filesystems scheduled-tasks move