我有一个C#应用程序,我想将一个文件复制到一个新的位置。有时我需要覆盖现有的文件。 发生这种情况时,我收到一个System.IO.IOException。我想从共享冲突中恢复,但是如何确定由于目标文件正在使用而不是其他原因而返回IOException?我可以查找“该进程无法访问该文件,因为它正在被另一个进程使用”。消息......但我不喜欢那个想法。如何确定是否由于共享冲突而抛出IOException?
5
A
回答
5
此article说明如何获取异常HRESULT,以便您可以确定错误原因。
-1
查找,你可以处理,例如明确的错误代码:
赶上(例外U) { 如果(((SocketException)U).ErrorCode == 10035) ...
到这里看看: http://msdn.microsoft.com/en-us/library/ms681391(VS.85).aspx
错误代码,如:
ERROR_SHARING_VIOLATION - 32 - 为0x20
ERROR_ACCESS_DENIED = 5 - 为0x5
ERROR_FILE_NOT_FOUND - 2 - 0×2
+0
从IOException转换到SocketException将如何成功? – 2009-01-08 21:53:48
7
这是我想出了解决方案。
private void RobustMoveFile(System.IO.DirectoryInfo destinationDirectory, System.IO.FileInfo sourceFile, Boolean retryMove)
{
try
{
string DestinationFile = Path.Combine(destinationDirectory.FullName, sourceFile.Name);
if (File.Exists(DestinationFile))
sourceFile.Replace(DestinationFile, DestinationFile + "Back", true);
else
{
sourceFile.CopyTo(DestinationFile, true);
sourceFile.Delete();
}
}
catch (System.IO.IOException IOEx)
{
int HResult = System.Runtime.InteropServices.Marshal.GetHRForException(IOEx);
const int SharingViolation = 32;
if ((HResult & 0xFFFF) == SharingViolation && retryMove)
RobustMoveFile(destinationDirectory, sourceFile, false);
throw;
}
}
1
正如其他答案所述,您需要获取错误的HResult并检查它。 32的HResult是共享违规。
在.NET 4.5,该IOException
具有公共HResult
属性,因此你可以做如下:
try
{
// do file IO here
}
catch (IOException e)
{
if (e.HResult == 32) // 32 = Sharing violation
{
// Recovery logic goes here
}
else
{
throw; // didn't need to catch this
}
}
在早期版本的.NET,但是,你需要得到HResult
通过调用Marshal.GetHRForException(Exception)
,所以类似的代码将是:
try
{
// do file IO here
}
catch (IOException e)
{
int HResult = System.Runtime.InteropServices.Marshal.GetHRForException(e)
if (HResult == 32) // 32 = Sharing violation
{
// Recovery logic goes here
}
else
{
throw; // Or do whatever else here
}
}
的尚未公布C#6.0意愿,根据A C# 6.0 Language Preview,允许您使用此语法只捕获共享冲突:
try
{
// do file IO here
}
catch (IOException e)
if (e.HResult == 32) // 32 = Sharing violation
{
// Recovery logic goes here
}
相关问题
- 1. 动作侦听器/抛出IOException冲突
- 2. 如何确定ftok共享内存冲突
- 3. 如何处理由java.net.URL.openConnection()抛出的IOException?
- 4. 如何知道是否由于外键违规而抛出SQLException?
- 5. 共享库名称冲突
- 6. 共享git文件冲突
- 7. 确定课程时间是否冲突
- 8. File.Replace抛出IOException
- 9. Application.GetResourceStream抛出IOException
- 10. 是合并而不冲突相当于rebase没有冲突?
- 11. 错误VSP1737:由于共享冲突导致文件无法打开
- 12. 静态和共享库符号冲突?
- 13. 共享数据之间的冲突
- 14. 银行冲突CUDA共享内存?
- 15. GPU共享内存银行冲突
- 16. Visio:DOS共享冲突(错误1532)
- 17. 确定CoreApplicationView.GetCurrentView()是否会抛出异常?
- 18. 解决yacc冲突 - 规则在分析器中由于冲突而无用
- 19. 为什么Scanner使用Scanner#ioException()而不是抛出异常?
- 20. 共享主机中的虚拟目录是否与wwwroot中的内容冲突?
- 21. new int []抛出'访问冲突'异常
- 22. 字符指针抛出访问冲突
- 23. 休眠抛出PK冲突错误
- 24. 为什么HttpURLConnection.getResponseCode()抛出IOException?
- 25. Memcache get方法抛出IOException
- 26. System.IO.File.Copy抛出IOException异常
- 27. InputStreamReader中抛出IOException异常
- 28. HttpURLConnection POST请求抛出IOException
- 29. RegistryKey.GetSubKeyNames抛出IOException异常
- 30. 为什么ByteArrayOutputStream.close()抛出IOException?
我正要表明:) – 2009-01-08 21:37:40
没有,IOException异常使用HRESULT COR_E_IO具有恒定值0x80131620 [请参阅IOException类](https://msdn.microsoft.com/en-us/library/system.io.ioexception(v = vs.110).aspx)。 – tibx 2018-02-19 14:14:36
但实际上似乎IOException类的HResult属性具有真正的HRSEULT错误原因... – tibx 2018-02-19 14:22:16