我看到了两个问题:
Is there a way to check if a file is in use?
他们都没有提供我所需要的全部信息,并且我需要对一些答案进行更多的说明,但是这些问题已有多年历史了,所以我不确定是否应该尝试从中获得答复。在这里。
所以我发布了一个新问题。像
public string myFile;
myFile = @"C:\somepath\somefile.pdf";
if (myFile isinuseorwhatever)
{
MessageBox.Show("File is in use!! Close it and try again");
return;
}
else
{
MessageBox.Show("That worked. Good job!")
//Do Stuff and lots of lines of stuff.
}
我可以使用异常处理来执行此操作,但是问题是我需要在运行多行代码之前进行检查。
我觉得我需要创建一门课程来检查它,然后运行该课程。老实说,我对编码还很陌生,所以我对类的工作方式不是100%清楚。
我知道使用try
和catch
的方法,但这在这里不起作用,因为在try
块的最后几行代码中发生了异常,因此这些东西会在遇到异常之前发生。就像,该程序复制文件,将其重命名,将其移动到另一个目录,然后删除原始文件,这是它的最后一件事。如果用户打开了文件,它将执行所有操作,但是在尝试删除时会引发异常。在复制,重命名,移动等之前,我需要它引发异常。
答案 0 :(得分:2)
通过将FileStream
与FileShare.None
结合使用,可以锁定文件以进行独占访问。因此,如果我们要实现提到的第一个请求
您可以实现以下代码:
try
{
using (Stream stream = new FileStream("1.docx", FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
// Here you can copy your file
// then rename the copied file
}
}
catch (Exception ex)
{
MessageBox.Show("File is in use!! Close it and try again");
return;
}
我认为您知道如何复制和重命名该文件(如果未注释,则将在此处添加代码)。
问题的第二部分有些棘手。因为您不能使用Filestream删除文件。一旦将filestream
配置为调用File.Delete("YourFile.doc")
,就有可能在那一刻有人准确地访问它。
我建议您在锁定文件时将其截断,以便其他用户无法使用。您也可以保持过程循环,直到文件被释放。代码如下所示:
try
{
using (Stream stream = new FileStream("1.docx", FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
// Here you can copy your file
// then rename the copied file
using (StreamWriter writer = new StreamWriter(stream, Encoding.Unicode))
{
writer.Write(""); // truncate the file, making it unusable to others
}
}
while (true)
{
try
{
File.Delete("1.docx");
}
catch
{
}
}
}
catch (Exception ex)
{
MessageBox.Show("File is in use!! Close it and try again");
return;
}
答案 1 :(得分:0)
使用bool值,如果尝试打开文件时抛出异常,则将其设置为false。
示例:
string path = "Your Path";
bool available = true;
try
{
using (FileStream fs = File.Open(path, FileMode.Open))
{
}
}
catch(Exception ex)
{
available = false;
}
答案 2 :(得分:0)
当前@ code-pope接受的答案包含在try-catch中的太多代码,它认为每个异常都是由于“文件正在使用中”而发生的,而实际上,异常也可能由于其他原因而出现
我会做这样的事情:
string path = "some path";
FileStream fs = null;
try
{
fs = new FileStream("1.docx", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch(Exception ex)
{
//ops, cannot open file, better not keep on
MessageBox.Show("File is in use!! Close it and try again");
return;
}
// lets go on now...
using (fs)
{
// do your work
}