Процесс не может получить доступ к файлу, потому что он используется другим процессом - PullRequest
4 голосов
/ 21 мая 2011

Когда я запускаю консольное приложение .net из файла bat, например, start myapp.exe

myapp.exe, затем пытается записать файл в его текущий каталог, хотя я получаю ошибку времени выполнения .net, утверждая, чтофайл используется другим приложением (больше ничего не работает)

http://i.stack.imgur.com/XLmnR.png

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

Может ли кто-нибудь пролить свет на это?

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FileSearcher
{
class Program
{    
    static void Main(string[] args)
    {
        string dirPath = "C:\\";
        FileSystemWatcher fileWatcher = new FileSystemWatcher(dirPath); 
        fileWatcher.IncludeSubdirectories = true;  
        fileWatcher.Filter = "*.exe";    
        // fileWatcher.Filter = "C:\\$Recycle.Bin";   
        //  fileWatcher.Changed += new FileSystemEventHandler(FileWatcher_Changed);   
        fileWatcher.Created += new FileSystemEventHandler(FileWatcher_Created);    
        //  fileWatcher.Deleted += new FileSystemEventHandler(FileWatcher_Deleted);  
        //  fileWatcher.Renamed += new RenamedEventHandler(FileWatcher_Renamed);    
        fileWatcher.EnableRaisingEvents = true;      

        // updated code


        Console.ReadKey(); 
    }



        static void FileWatcher_Renamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine(e.OldName + " was renamed to " + e.Name);
        }

        static void FileWatcher_Deleted(object sender, FileSystemEventArgs e)

        {
            Console.WriteLine(e.Name + " was deleted");
        }

        static void FileWatcher_Created(object sender, FileSystemEventArgs e)
        {

            using (StreamWriter fileWriter = new StreamWriter("process.lst", true))
            {
                var data = true;
                fileWriter.Write("C:\\" + e.Name + Environment.NewLine);
            }


        }

        static void FileWatcher_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine(e.Name + "");
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 21 мая 2011

Похоже, из вашего пакетного файла вы отправляете стандартный вывод (1>) в тот же файл (process.lst), в который вы пишете в своем приложении. Вы можете сделать одно или другое, но не оба .

Например, это приложение отлично работает при запуске само по себе:

static void Main(string[] args)
{
    StreamWriter writer = File.CreateText("process.lst");

    Console.WriteLine("Writing to the file.");

    writer.Write("Testing 1.2.3.4");

    Console.WriteLine("Finished.");
}

Но при запуске изкомандная строка типа myTestApp.exe 1> process.lst выдает то же исключение, что и у вас:

The process cannot access the file 'process.lst' because it is being used by another process.

0 голосов
/ 21 мая 2011

Событие того, что файл был создан, запускается немедленно, даже если файл еще не записан. Вы всегда должны пытаться открыть файл и немного подождать, когда вы получите IOException. Вы можете найти решение здесь: http://bloggingabout.net/blogs/jschreuder/archive/2006/07/06/12886.aspx

0 голосов
/ 21 мая 2011

Попробуйте выполнить ваш процесс после завершения события OnCreated.Может быть, запуск короткого таймера и запись файла, когда таймер тикает (не забудьте остановить таймер)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...