Проверьте, используется ли файл, дождитесь его завершения - PullRequest
4 голосов
/ 26 января 2012

У меня есть проблема в моем приложении:

  • Шаг 1 - создайте файл (xml) и поместите в него некоторое содержимое
  • Шаг 2 - стороннее приложение откроет файл и получит информацию из файла, созданного на шаге 1.
  • Шаг 3 - снова удалить файл.

Первый вопрос, который у меня возник, касается этой части кода:

XmlDocument xmlDoc = new XmlDocument();
DataSet ds = //use a method to put in the data
xmlDoc.LoadXml(ds.GetXml());
xmlDoc.Save("Filename");
// ...
Process.Start(startInfo);

Верно ли мое предположение, что последняя строка выполняется только тогда, когда вышеописанное уже выполнено? Так что я могу быть на 100% уверен, что все данные находятся в XML, прежде чем он попытается их запустить правильно?

Вторая часть, где я сейчас получаю сообщение об ошибке, находится здесь:

Process.Start(startInfo);
File.Delete("Filename");

Что происходит сейчас, так это то, что файл уже удален до того, как сторонняя программа прочитала его в своей памяти.

Можно ли как-нибудь проверить, что файл больше не используется, или сделать какой-то стабильный способ ожидания?

Я уже нашел способ использовать Thread.Sleep(TimeInMiliSec);, но я думаю, что это неправильный способ сделать это (скорее как обходное решение)?

Ответы [ 5 ]

9 голосов
/ 26 января 2012

Описание

Вы можете использовать метод в моем примере и сделать цикл while.

Пример

while (IsFileLocked(new FileInfo("YourFilePath")))
{
    // do something, for example wait a second
    Thread.Sleep(TimeSpan.FromSeconds(1));
}
// file is not locked

public static bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }
    return false;
}
3 голосов
/ 26 января 2012

Похоже, вам просто нужно добавить что-то вроде следующего:

Process p = new Process();
p.StartInfo = startInfo;
p.WaitForExit();

Process.Start () запускает другой процесс, но не ожидает завершения этого процесса, прежде чем продолжить.

2 голосов
/ 26 января 2012
Process process = Process.Start(startInfo);
process.WaitForExit(); // alteratively, you can use WaitForExit(int milliseconds)
File.Delete("Filename");  
1 голос
/ 26 января 2012

Это распространенная проблема. Решение, к сожалению, попробуйте открыть его и посмотреть, есть ли исключение.

Используйте IsFileLocked (...) отсюда:

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

И сделать что-то вроде:

while ( IsFileLocked(new FileInfo(FilePath)) ) 
{ 
    Thread.Sleep(TimeInMiliSec); 
}
0 голосов
/ 26 января 2012

Вместо этого вы можете проверить, запущен ли процесс ...

        if (System.Diagnostics.Process.GetProcessesByName("notepad").Length < 1)
        {
            Console.WriteLine("The process isnt running"); 
        }
        else
        {
            Console.WriteLine("The process is running..."); //Your code to delete the file
        }

Может быть, вы бы создали таймер и проверяли это каждые несколько секунд?

Надеюсь, это поможет, мой первый пост здесь: -)

...