Использование C # для проверки, используется ли файл - PullRequest
0 голосов
/ 11 января 2019

Я видел оба этих вопроса:

Проверьте, используется ли файл

Есть ли способ проверить, используется ли файл?

И ни один из них не предоставил мне всю необходимую мне информацию, и мне нужно было уточнить некоторые ответы, но вопросам было несколько лет, поэтому я не был уверен, стоит ли мне пытаться получить ответы от там в этот момент.

Итак, я разместил новый вопрос. Что-то вроде

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.
}

Я могу сделать это с помощью обработки исключений, но проблема заключается в том, что мне нужно выполнить проверку, прежде чем я выполню много строк кода.

У меня такое чувство, что мне нужно создать класс, чтобы проверить его, а затем запустить этот класс. Если честно, я довольно новичок в кодировании, поэтому мне не совсем понятно, как работают классы.

Я знаю об использовании try и catch, но здесь это не сработает, потому что исключение происходит в последних нескольких строках кода в блоке try, поэтому все эти вещи будут происходить до него попадает в исключение. Например, эта программа копирует файл, переименовывает его, перемещает в другой каталог, а затем удаляет оригинал, что является последним, что он делает. Если у пользователя открыт файл, он сделает все это, но затем выдаст исключение при попытке удаления. Мне нужно, чтобы оно выдало исключение, ДО того, как оно скопирует, переименует, переместит и т. Д.

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Используйте значение bool и установите его в false, если при попытке открыть файл возникает исключение.

Пример:

    string path = "Your Path";
    bool available = true;
    try
    {
        using (FileStream fs = File.Open(path, FileMode.Open))
        {

        }
    }
    catch(Exception ex)
    {
        available = false;
    }
0 голосов
/ 11 января 2019

Текущий принятый ответ @ 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
}
0 голосов
/ 11 января 2019

Вы можете заблокировать файл для монопольного доступа, используя FileStream с FileShare.None. Так что если мы хотим реализовать первые упомянутые запросы, т.е.

  1. проверить, используется ли файл, если да, сообщить пользователю
  2. если не заблокировать, то никто не откроет его
  3. скопировать файл
  4. переименовать файл

Вы можете реализовать следующий код:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...