代码无法检测文件是否已打开

时间:2018-03-02 21:18:27

标签: c# asp.net filestream

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

DBMS_SESSION.SLEEP (seconds  IN NUMBER)

1 个答案:

答案 0 :(得分:2)

您的测试有问题。 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();
}