由于文件正在被其他进程使用,所以该进程无法访问该文件。

4
当我从.bat文件启动我的.NET控制台应用程序时,例如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 + "");
        }
    }
}

2
请发布你的写入文件的代码。 - Alireza Maddah
你尝试过使用Unlocker来确定哪个进程正在使用该文件吗? - MPelletier
3个回答

2

从您的批处理文件中看来,您正在将stdout(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,会出现与您相同的异常:

由于正在被另一个进程使用,因此无法访问文件'process.lst'。


啊,谢谢。那我应该把所有的Console.Writeline引用都删掉吗? - Jay
不要删除它们,只是不要在批处理文件中重定向stdout。 - Forgotten Semicolon
啊,我明白你的意思了,虽然我没有重定向sdout输入,但我只是启动文件,例如启动program.exe。 - Jay
您的图像显示了应用程序的执行路径为 E:... 1>process.lst。需要删除的是 1>process.lst。 - Forgotten Semicolon

0

尝试在OnCreated事件完成后执行您的进程。也许启动一个短定时器,并在计时器滴答时写入文件(记得停止计时器)


http://social.msdn.microsoft.com/forums/en-US/winforms/thread/43daf8b2-67ad-4938-98f7-cae3eaa5e63f/ - Hugo

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接