如何检查IOException"磁盘空间不足"异常类型?
目前我检查消息是否与"磁盘空间不足"相匹配,但我知道如果操作系统语言不是英语,这将不起作用.
我有一些.csv文件,我正在使用它作为测试台的一部分.我可以打开它们并且没有任何问题地阅读它们,除非我已经在Excel中打开了文件,在这种情况下我获得了IOException:
System.IO.IOException:进程无法访问文件'TestData.csv',因为它正由另一个进程使用.
这是测试平台的片段:
using (CsvReader csv = new CsvReader(new StreamReader(new FileStream(fullFilePath, FileMode.Open, FileAccess.Read)), false))
{
// Process the file
}
Run Code Online (Sandbox Code Playgroud)
这是StreamReader的限制吗?我可以在其他应用程序(例如Notepad ++)中打开该文件,因此它不能成为操作系统问题.也许我需要使用其他一些课程?如果有人知道如何绕过这个(除了关闭excel!)我会非常感激.
我在C#(.NET Web服务)中创建一个文件,并且不想覆盖现有文件.
方法似乎是构建一个FileMode.CreateNew设置的FileStream.事实上,如果文件存在,它会抛出异常.
但是,如何识别此异常,而不是文件创建引发的其他可能异常?http://msdn.microsoft.com/en-us/library/47ek66wy.aspx上的文档将此案例列为"IOException",这显然是模糊的,因为其他事情可能会导致这种情况.
这里的答案是我捕获IOException然后只是做一个File.Exists?
我需要捕获以下特定异常:
捕获到System.Data.OleDb.OleDbException ErrorCode = -2147467259
Message ="您向表请求的更改未成功,因为它们将在索引,主键或关系中创建重复值.更改字段或字段中的数据包含重复数据,删除索引或重新定义索引以允许重复条目,然后重试." Source ="Microsoft JET数据库引擎"StackTrace:位于System.Data.OleDb.OleDbCommand的System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)处的System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams,Object&executeResult). System.Data.OleDb.OleDbCommand.ExecuteNonQuery上的System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior,String method)中的System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior,Object&executeResult)中的ExecuteCommandText(Object&executeResult)( )
我不确定ErrorCode它是什么,但它看起来不可靠.
我可以依赖于Message跨平台的相同吗?
我可以以某种方式使用OleDbHResult hr堆栈跟踪中找到的值吗?(参见/sf/answers/69416231/)
是做一个文本搜索的唯一解决方案Message的话想duplicate和primary key?
我发现有时在IO操作中会抛出常见的IOException.我可以使用Marshal.GetHRForException(异常e)方法(在这里找到)来确定特定的错误代码.之后,我想使用我的应用程序特定的错误代码重新抛出异常,以便向用户提供一些错误的提示.但我无法找到IOException的可能HResult值列表.
我坚持的另一件事是,对于不同的HResult代码,根本原因可能是相同的 - 例如,0x8007052E和0x80070569 - 都对应于Logon failure: unknown user name or bad password.
我试图搜索类似"IOException HResult values"之类的东西,但是没有什么特别的用于映射IOException HResult与人类可读的错误(像这样或这样).
我也在这里看到了一个非常相似的问题,但仍然没有解决方案.
那么,有关IOException HResults值的文档在哪里?
我们有一个Windows Forms应用程序,该应用程序连接到某些Web服务。它列出了系统中的文档,当用户双击文档时,我们将文件下载到本地计算机,然后打开文档进行编辑。用户关闭文档后,我们会将其上传回系统。
在此过程中,我们一直在监视文档上的文件锁定。释放文件锁后,我们就会上载文档。
该IsFileLocked方法如下所示:
private const int ErrorLockViolation = 33;
private const int ErrorSharingViolation = 32;
private static bool IsFileLocked(string fileName)
{
Debug.Assert(!string.IsNullOrEmpty(fileName));
try
{
if (File.Exists(fileName))
{
using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
{
fs.ReadByte();
}
}
return false;
}
catch (IOException ex)
{
// get the HRESULT for this exception
int errorCode = Marshal.GetHRForException(ex) & 0xFFFF;
return errorCode == ErrorSharingViolation || errorCode == ErrorLockViolation;
}
}
Run Code Online (Sandbox Code Playgroud)
我们将其称为循环,两次尝试之间有5秒钟的睡眠时间。在大多数情况下,这似乎效果很好,但有时我们会IOException从这种方法中看到一个。我看不到有可能引发此异常。
例外是:
IOException: The process cannot …Run Code Online (Sandbox Code Playgroud) .net ×5
c# ×4
ioexception ×3
hresult ×2
diskspace ×1
exception ×1
file ×1
file-exists ×1
readonly ×1
streamreader ×1