代码未检测到文件已打开

Code doesn't detect file is open

我有一个 ASP.Net 4.5 网络应用程序。单击按钮时,其中一个页面将文件写入文件系统。这个文件也被另一个进程访问,一个我无法控制的第三方程序。这个其他程序读取文件,然后将其移动到子文件夹。因此,我正在使用 Append FileMode 创建一个 FileStream:如果文件不存在,它会创建它,如果存在,它会附加到它。我想在我的应用程序中确保在单击按钮时该第三方应用程序未访问该文件。我写了下面的代码(我抄袭了from here),但是当我测试它时,它没有检测到文件是打开的。当我说文件已打开时,我的意思是在测试期间我在记事本中打开文件。如果重要的话,我正在使用 Visual Studio 2012 在 Windows 7 机器上完成这项工作。为什么它看不到文件已打开?

bool TryOpen(string FileWithPath, out FileStream fs)
    {
        try
        {
            fs = File.Open(FileWithPath, FileMode.Append, FileAccess.Write, FileShare.None);
            return true;
        }
        catch (Exception ex)
        {
            fs = null;
            return false;
        }
    }

    FileStream OpenASAP(string path, int maxTries)
    {
        FileStream fs = null;
        bool lastResult = false;
        int count = 0;
        while ((lastResult = !TryOpen(path, out fs)) && count < maxTries)
        {
            Thread.Sleep(100);
            count++;
        }
        if (!lastResult || count >= maxTries)
        {
        }
        return fs;
    }

protected void writeToClientFile(DataSet ClientGenl, DataSet ClientBus, DataSet ClientBill)
    {
        FileStream fileStream = null;
        string fileName = "ClientTest.txt";
         string pathName = ConfigurationSettings.AppSettings["EliteFilePath"].ToString();
            try
        {
            using (new KLClassLibrary.Impersonator(proxyaccount, domain, password))
            {
fileStream = OpenASAP(pathName + fileName, 3);
etc.....
}

您的测试有误。 Windows notepad 应用程序不锁定文件,它将内容读入内存并立即释放文件句柄。

使用您知道的其他应用程序来锁定文件 编写一个虚拟控制台,使用 FileStream 打开文件并在您之后释放它按一个按钮,例如:

using (var f = File.Open(@"c:\some-path\some-name.ext", FileMode.Append, FileAccess.Write, FileShare.None))
{
    Console.WriteLine("File locked. Press ENTER to continue");
    Console.ReadLine();
}