将文件移动到新创建的目录时获取System.IO.IOException

时间:2015-08-10 05:56:51

标签: c# ioexception locked

我有一个代码来创建新文件夹并使用FileSystemWatcher将文件移动到该文件夹​​。但它会出现以下错误。

  

System.IO.IOException:进程无法访问该文件,因为它   正在被另一个过程所吸引。在   System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)
  在System.IO .__ Error.WinIOError()在System.IO.File.Move(String   sourceFileName,String destFileName)at   FolderWatcher.Program.ProcessRenewalFolder(对象发送者,   FileSystemEventA rgs e)

以下是代码

'private static void ProcessRenewalFolder(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("Renewal Received.... ");
        DirectoryInfo d = new DirectoryInfo(@"E:\SCN_DOCS\RENEWAL\");
        DirectoryInfo dest = new DirectoryInfo(@"E:\QUEUED_SCN_DOCS\RENEWAL\");

        if (!d.Exists)
        {
            return;
        }


        FileInfo[] Files = d.GetFiles("*.pdf");
        string jobNo = "";
        string branchCode = "";
        foreach (FileInfo file in Files)
        {
            jobNo = file.Name;

            DirectoryInfo newDir = null;

            if (!Directory.Exists(dest.FullName + jobNo.ToUpper()))
            {
                System.IO.Directory.CreateDirectory(dest.FullName + jobNo.Substring(0, file.Name.LastIndexOf(".")).ToUpper());
            }
            Console.WriteLine(jobNo + " -     " + branchCode);
            try
            {

                File.Move(file.FullName, dest.FullName + jobNo.Substring(0, file.Name.LastIndexOf(".")).ToUpper() + "\\" + file.Name.ToUpper());
                UpdateRenewal(jobNo.Substring(0, file.Name.LastIndexOf(".")).ToUpper());


            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }'

请让我知道原因......

2 个答案:

答案 0 :(得分:0)

在以下文件夹路径中

DirectoryInfo d = new DirectoryInfo(@"E:\SCN_DOCS\RENEWAL\")

使用c#应用程序创建的任何新文件,如果是,则需要处理新创建的文件的对象,例如

Bitmap bitmap = new Bitmap();
// your Image file creation code...
bitmap.Dispose();

根据您的问题,您正在使用.pdf文件,因此如果您在移动文件之前在上面的文件夹中创建了任何新的pdf文件,那么您需要处理新创建的pdf文件的对象。

请参阅此回答here

答案 1 :(得分:0)

如果文件在生成PDF的程序(即将其放入文件夹中的程序)中仍然打开,则可能发生这种情况。

当你使用目录观察者时,我建议你:

  1. 将所有观看过的文件放在某种列表中。
  2. 使用Timer并处理列表中已有X秒的文件。
  3. 如果无法访问该文件,请将其放在列表的末尾。
  4. 通过这种方式,您可以获得更宽容的解决方案,并且由于错误,您不太可能错过文件。