0

我正在尝试根据创建日期将 csv 文件从一个位置移动到另一个位置。

但是我在不工作时使用的代码显示错误 sample.csv 已被另一个进程使用,我该如何解决这个问题?

这是错误消息“错误:System.Reflection.TargetInvocationException:调用目标已引发异常。---> System.IO.IOException:进程无法访问文件'C:\新文件夹\测试。 txt' 因为它正被另一个进程使用。在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite) at ST_b8571e8d94a54a80ab50a1e221d93b11.vbproj.ScriptMain .Main() --- 内部异常堆栈跟踪结束 --- System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] 参数,签名签名,System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数, CultureInfo 文化, Boolean skipVisibilityChecks) 处的 MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder、Object[] 参数、CultureInfo 文化)在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)在 System Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 处的 .Type.InvokeMember(字符串名称,BindingFlags invokeAttr,Binder binder,Object 目标,Object[] args,CultureInfo 文化)RuntimeTypeHandle typeOwner) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数, CultureInfo 文化, Boolean skipVisibilityChecks) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数,CultureInfo 文化)在 System.RuntimeType.InvokeMember(字符串名称,BindingFlags bindingFlags,Binder binder,对象目标,Object[] providedArgs,ParameterModifier[] 修饰符,CultureInfo 文化,String[] namedParams)在 System.Type。 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 上的 InvokeMember(字符串名称,BindingFlags invokeAttr,Binding 绑定器,对象目标,Object[] args,CultureInfo 文化)RuntimeTypeHandle typeOwner) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数, CultureInfo 文化, Boolean skipVisibilityChecks) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数,CultureInfo 文化)在 System.RuntimeType.InvokeMember(字符串名称,BindingFlags bindingFlags,Binder binder,对象目标,Object[] providedArgs,ParameterModifier[] 修饰符,CultureInfo 文化,String[] namedParams)在 System.Type。 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 上的 InvokeMember(字符串名称,BindingFlags invokeAttr,Binding 绑定器,对象目标,Object[] args,CultureInfo 文化)System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数, CultureInfo 文化) 在 System.RuntimeType.InvokeMember( System.Type.InvokeMember 处的字符串名称、BindingFlags bindingFlags、BindingFlags、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)(字符串名称、BindingFlags invokeAttr、Binder binder、Object 目标、Object [] args,CultureInfo 文化)在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()"System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] 参数, CultureInfo 文化) 在 System.RuntimeType.InvokeMember( System.Type.InvokeMember 处的字符串名称、BindingFlags bindingFlags、BindingFlags、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)(字符串名称、BindingFlags invokeAttr、Binder binder、Object 目标、Object [] args,CultureInfo 文化)在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()"System.RuntimeType.InvokeMember(字符串名称,BindingFlags bindingFlags,Binding 活页夹,对象目标,Object[] 提供的Args,ParameterModifier[] 修饰符,CultureInfo 文化,String[] namedParams ) 在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 的 System.Type.InvokeMember(字符串名称,BindingFlags invokeAttr,Binder binder,Object 目标,Object[] args,CultureInfo 文化)System.RuntimeType.InvokeMember(字符串名称,BindingFlags bindingFlags,Binding 活页夹,对象目标,Object[] 提供的Args,ParameterModifier[] 修饰符,CultureInfo 文化,String[] namedParams ) 在 Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 的 System.Type.InvokeMember(字符串名称,BindingFlags invokeAttr,Binder binder,Object 目标,Object[] args,CultureInfo 文化)Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 处的活页夹活页夹、对象目标、对象 [] 参数、CultureInfo 文化)Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 处的活页夹活页夹、对象目标、对象 [] 参数、CultureInfo 文化)

 Public Sub Main()
        Dim csvFilesToday = New List(Of String)
        Dim sourceDir As String = "C:\New folder"
        Dim backupDir As String = "C:\New folder (2)"

        For Each csv In Directory.GetFiles(sourceDir, "*.csv", IO.SearchOption.AllDirectories)
            If File.GetCreationTime(csv).Date = Date.Today Then
                File.Copy(Path.Combine(sourceDir, csv), Path.Combine(backupDir, csv), True)
            End If
        Next
        Dts.TaskResult = ScriptResults.Success
    End Sub

End Class
4

2 回答 2

1

您必须确定持有文件锁定的进程。

我有一篇关于如何使用进程资源管理器来完成此任务的文章:File in use by another process

不过,如果您打开 Excel,则快速关闭它。否则,请检查您的文本编辑器

于 2013-11-07T22:43:29.973 回答
0

这不会解决您的问题,但会改进您的代码:

 Public Sub Main()
    Dim sourceDir As New DirectoryInfo("C:\New folder")
    Dim backupDir As String = "C:\New folder (2)"

    'Using DirectoryInfo.EnumerateFiles will reduce the total number of disk accesses
    For Each csv In sourceDir.EnumerateFiles("*.csv", SearchOption.AllDirectories.Where(Function(i) i.CreationTime >= Date.Today)
        Try
            File.Copy(csv.FullName, Path.Combine(backupDir, csv.Name), True)
        Catch Ex As IOException
            'Do something with the error here

        End Try
    Next csv

    Dts.TaskResult = ScriptResults.Success
End Sub
于 2013-11-07T22:53:23.313 回答