解决File的最佳解决方案无法访问错误

时间:2013-05-28 15:08:17

标签: c# file-access

我有一个多线程应用程序。我的问题是,有时我得到一个错误,例如程序无法访问文件,因为它被其他东西(应用程序的其他部分)使用。

现在我所做的就是捕获异常并在100ms延迟后重复该任务。

它正在运行,因为应用程序不会经常打开文件,并且只是在短时间内打开文件。

虽然我对这个解决方案不满意,因为它很难看,但它仍然可能出错。

有什么好方法可以解决这个问题吗?如果没有任何简单的答案,你需要更多关于应用程序的信息(什么文件,我可能在同一时间访问的原因)我可以回答,我只是试着让问题简单,通用。

此致 丹尼尔

编辑:

我做了一些快速的事情,你们对这个解决方案有什么看法,它不是最通用的,但是现在没有更好的想法:

当程序尝试写入文件时,检查它是否被使用。如果使用它,则在应用程序想要再次写入文件并且文件可以自由插入所有数据时,在内存中收集数据。

它仍然不是最好的,但它可能会提供更多的想法。

1 个答案:

答案 0 :(得分:3)

由于您的应用程序正在读取和写入文件,因此您需要做的就是跟踪应用程序正在使用哪些文件。保留由文件名键入的R/W locks字典。当您去访问文件时,请取出相应的锁。

以下是编码方式:

Dictionary<string, ReaderWriterLockSlim> lockDict = new Dictionary<string, ReaderWriterLockSlim>();

ReaderWriterLockSlim LockFile(string filename, bool readOnly)
{
    var fullPath = System.IO.Path.GetFullPath(filename);
    ReaderWriterLockSlim myLock;
    // lock the dictionary while we're accessing it
    lock (lockDict)
    {
        if (!lockDict.TryGetValue(fullPath, out myLock))
        {
            myLock = new ReaderWriterLockSlim();
            lockDict[fullPath] = myLock;
        }
    }
    // only block on the file lock once the dictionary is unlocked
    if (readOnly)
        myLock.EnterReadLock();
    else
        myLock.EnterWriteLock();
    // file is now "locked", so caller can proceed with read/write, then unlock
    return myLock;
}

你可以像这样使用它:

// block until we're not using the file anymore
var myLock = LockFile(filename, readOnly: false);
try
{
    using (var file = new StreamWriter(filename))
    {
    ...
    }
}
finally
{
    myLock.ExitWriteLock();
}