File.Move不再起作用

kriscs1

会员
已加入
2020年1月30日
留言内容
6
编程经验
Beginner
你好
我有一个程序检查文件夹中是否有Excel文件,然后通过SQL将其内容导入数据库表,然后将Excel文件移至“已完成”文件夹。
去年,此操作完美无缺。 Unfortunatley,我现在收到以下错误:

System.IO.IOException:该进程无法访问该文件,因为它正在被另一个进程使用。
在System.IO .__ Error.WinIOError(Int32 errorCode,字符串mayFullPath)
在System.IO .__ Error.WinIOError()
在System.IO.File.InternalMove(String sourceFileName,String destFileName,Boolean checkHost)
在System.IO.File.Move(字符串sourceFileName,字符串destFileName)
159:

数据上传就可以了。这只是问题之后才移动文件。

以下是相关代码:
C#:
        private static void InsertExcelRecords(string filePath, string destinationPath)
        {
            LogWriter Log = new LogWriter("");
            try
            {
                //  ExcelConn(_path); 
                string constr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""", filePath);
                OleDbConnection Econ = new OleDbConnection(constr);
                string Query = string.Format("Select [Student ID],[Activity],[Session Name],[Date],[Time],[Status],[Sub-Session Name] FROM [{0}]", arg0: "data_RawAttendanceLog$");
                OleDbCommand Ecom = new OleDbCommand(Query, Econ);
                Econ.Open();

                //Create one dataset and fill this data set with this selected items, using oledbdataadpter
                DataSet ds = new DataSet();
                OleDbDataAdapter oda = new OleDbDataAdapter(Query, Econ);
                Econ.Close();
                oda.Fill(ds);
                DataTable Exceldt = ds.Tables[0];

                for (int i = Exceldt.Rows.Count - 1; i >= 0; i--)
                {
                    if (Exceldt.Rows[i]["Student ID"] == DBNull.Value)
                    {
                        Exceldt.Rows[i].Delete();
                    }
                }
                Exceldt.AcceptChanges();

                //creating object of SqlBulkCopy     
                string csDestination = "server = " + GetValueFromFile("server") + "; database = " + GetValueFromFile("database") + "; Trusted_Connection=True"; // User ID = *redacted*; Password = ; Trusted_Connection=True";

                using (SqlConnection con = new SqlConnection(csDestination))
                {

                    SqlBulkCopy objbulk = new SqlBulkCopy(con);
                    //assigning Destination table name     
                    objbulk.DestinationTableName =  GetValueFromFile("DestinationTableName");
                    //Mapping Table column   

                    objbulk.ColumnMappings.Add("[Student ID]", "StudentID");
                    objbulk.ColumnMappings.Add("[Activity]", "Activity");
                    objbulk.ColumnMappings.Add("[Session Name]", "SessionName");
                    objbulk.ColumnMappings.Add("[Date]", "SessionDate");
                    objbulk.ColumnMappings.Add("[Time]", "SessionTime");
                    objbulk.ColumnMappings.Add("[Status]", "SessionStatus");
                    objbulk.ColumnMappings.Add("[Sub-Session Name]", "SubSessionName");

                    //inserting Datatable Records to DataBase   
                    SqlConnection sqlConnection = new SqlConnection();

                    con.Open();
                    objbulk.WriteToServer(Exceldt);

                    Console.WriteLine("Upload successful.");
                    Log.LogWrite("Upload successful.");
                    Econ.Close();
                    Log.LogWrite("Moving " + filePath + " to " + destinationPath);
                    File.Move(filePath, destinationPath);

                }

            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("network-related"))
                {
                    Console.WriteLine("Cancelled. No Network access.");
                    return;
                }
                else
                {
                    Console.WriteLine(string.Format("Upload has not been imported due to: {0}", ex.Message));
                    Log.LogWrite(string.Format("Upload has not been imported due to: {0}", ex.Message));
                    Console.WriteLine("Press any key to close...");
                    ShowWindow(GetConsoleWindow(), SW_SHOW);
                    Console.ReadKey();
                }

            }

        }

    }

让我知道您是否需要更多信息。
非常感谢。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
@谢平 关于错误处理(尤其是现有的文件大小写)有几点好处。

我试图在我的#19帖子中提出的要点是,在尝试进行文件移动时,我没有得到有关另一个进程正在打开文件的异常。起初,我认为这是因为OP进行异常和错误处理的方式所致,所以我专门发送了断点并启用了优先机会异常,以防万一我丢失了某些东西。我从来没有打开文件异常。我会得到文件存在异常,但是该异常非常清楚目标位置是否存在,而不是文件处于打开状态。
 

kriscs1

会员
已加入
2020年1月30日
留言内容
6
编程经验
Beginner
@谢平 非常感谢。我正在接受您对错误处理的意见。我认为,因为该程序仅由我在计算机上运行,​​所以我没有像应该那样处理所有异常。不幸的是,我仍然收到与您的代码相同的错误。

@跳伞 感谢您的检查。

鉴于该代码对你们俩都适用,我只能想到它必须是针对我的环境的,这可能是重新安装Office 365的结果。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
听起来您在一家拥有紧密锁定系统的公司工作。与您的IT安全团队合作。在进行测试运行时,让他们隔离单个系统并禁用AV 5分钟。如果在禁用AV的情况下可以工作,然后在启用AV的情况下再次失败,请他们联系供应商以尝试与您一起调试原因。

如果打开或关闭AV没有影响,请与您的桌面映像团队合作。看看他们是否会让您设置三个未主动连接到工作网络的VM。在一个VM中,具有其当前的桌面映像。第二个是一年前的桌面图像。第三,没有任何自定义项的Win10和Office的原始安装。这三个不同的图像应该可以帮助您缩小故障点的范围。

正如您在上面的第一段中所指出的那样,我有点怀疑AV软件是我的主要嫌疑人,但这也可能是Microsoft发出的更新中的错误。在过去的两年中,MS在将回归及其补丁和更新引入方面没有良好的记录。
 

kriscs1

会员
已加入
2020年1月30日
留言内容
6
编程经验
Beginner
听起来您在一家拥有紧密锁定系统的公司工作。与您的IT安全团队合作。在进行测试运行时,让他们隔离单个系统并禁用AV 5分钟。如果在禁用AV的情况下可以工作,然后在启用AV的情况下再次失败,请他们联系供应商以尝试与您一起调试原因。

如果打开或关闭AV没有影响,请与您的桌面映像团队合作。看看他们是否会让您设置三个未主动连接到工作网络的VM。在一个VM中,具有其当前的桌面映像。第二个是一年前的桌面图像。第三,没有任何自定义项的Win10和Office的原始安装。这三个不同的图像应该可以帮助您缩小故障点的范围。

正如您在上面的第一段中所指出的那样,我有点怀疑AV软件是我的主要嫌疑人,但这也可能是Microsoft发出的更新中的错误。在过去的两年中,MS在将回归及其补丁和更新引入方面没有良好的记录。

谢谢。是的,我觉得可能是AV。但是,即使文件关闭后30秒,它仍然不会移动。
我今天去与IT部门的某人交谈,鉴于该部门的性质,我可能要等一会儿才能进行整理。

同时,我通过不太紧急的解决方法解决了这个问题。

代替:
1)打开源文件夹中的每个文件,并将其内容上载到表中
2)如果成功,请将文件移至“已完成”文件夹

我创建了一个名为“ Processing”的新文件夹,并执行以下操作:
1)删除“处理中”文件夹中的所有文件
2)将任何文件从源文件夹复制到“处理中”文件夹
3)打开“处理”文件夹中的文件,并将其内容上载到表中
4)如果成功,请将文件从源文件夹移动到“已完成”文件夹

这样,由于实际上未打开源文件夹中的文件,因此File.Move成功。
在下一个程序运行时,正在打开的文件(在“ Processing”文件夹中)将被删除。

感谢您的帮助。
 

kriscs1

会员
已加入
2020年1月30日
留言内容
6
编程经验
Beginner
Microdoft Access数据库引擎?
Hi Kris,
我在尝试删除Excel文件时遇到了类似的问题,并抛出了相同的异常。
重新安装Microsoft数据库引擎可以解决问题。

你可以试试看吗?

嗨,KoenHoof,

不幸的是,由于我必须获得完整的重新映像,因此我无法验证是否可以解决该问题。但是,在重新映像和重新安装数据库引擎之后,file.move现在可以按预期运行。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,921
地点
英国
编程经验
10+
附带说明;与我以前发布的代码有关。当我发布它时,我实际上更多地关注了如果目标文件已经存在会发生的错误以及如果目标文件已经存在会如何处理的错误,我有点侧追不舍,而且从未完成写出处理目标文件的工作。文件正在使用中的错误。谢谢 @跳伞 为了向我全面说明这一点,我仍然没有时间对其进行编辑,但是很高兴看到你们解决了它,这是因为微软将责任归咎于创建了另一个您自己解决的错误。  (y)
 
最佳 底部