我有一个ASP.Net 4.5 Web应用程序。单击一个按钮时,其中一个页面将文件写入文件系统。此文件也可由另一个进程访问,这是我无法控制的第三方程序。此其他程序读取该文件,然后将其移动到子文件夹。因此,我正在使用附加FileStream
创建一个FileMode
:如果文件不存在则创建文件,如果文件不存在则附加到文件中。我想确保在我的应用程序中,当单击该按钮时,该第三方应用程序未访问该文件。我写了下面的代码(我把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();
}