【问题标题】:File.Move only Copy the fileFile.Move only 复制文件
【发布时间】: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


【解决方案1】:

尝试通过创建命令文件以管理员身份运行应用程序以管理员身份运行应用程序,而不是调用应用程序

  1. 新建文本文件“start.cmd”
  2. 以文本形式打开文件并编写命令 runas.exe /savecred /user:YourUser "YourAppFullPath"
  3. 现在运行“start.cmd”一次以输入用户密码。它将一直保存,直到用户更改它
  4. 然后您可以调用“start.cmd”而不是调用您的应用程序

【讨论】:

  • 我使用任务调度器运行该应用程序,它以最高权限运行。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多