0

我需要能够使用 Windows 服务中的 FileSystemWatcher 处理的 StreamReader 读取文件的行。

我已经阅读并尝试了所有在网上有意义的东西,但它仍然不起作用。当我连接到我的 Windows 服务进程(使用 Visual Studio 2010 的本地机器)时,整个过程完美无缺!

当我尝试运行它(在我的本地机器上)而不附加它并对其进行调试时,第二个文件永远不会通过,我得到以下消息:“进程无法访问文件'C:\Projects\Data\VendingStats \20121213_AZM_Journey_MIS.txt',因为它正被另一个进程使用。” 我没有在我的机器上的其他任何地方打开这个文件。它只是坐在一个目录中。然后我将它复制到一个目录中,然后 FSW 接管(以及下面的代码)。

有人可以告诉我我需要做什么才能让它工作吗?我不知道为什么当我附加并调试它时它工作正常,但是当我发送文件而不附加和调试它时它不起作用。我觉得这肯定是我本地盒子上需要禁用的东西,等等——我不知道.....

我注意到该错误甚至在它进入“使用”语句之前就发生了,因为第二个文件从未被复制到临时目录以进行处理。

我在 StackTrace 中注意到,我收到以下错误:system.io.__error.winioerror(int32 errorcode string maybefullpath)

这是我的代码:

protected override void OnStart(string[] args)
        {
            FileSystemWatcher Watcher = new FileSystemWatcher(@"C:\Projects\Data\VendingStats");
            Watcher.EnableRaisingEvents = true;
            Watcher.Created += new FileSystemEventHandler(Watcher_Created);
            Watcher.Filter = "*.txt";
            Watcher.IncludeSubdirectories = false;
        }

private void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            try
            {
                string targetPath =  @"C:\Temp\VendorStats";

                // Use Path class to manipulate file and directory paths. 
                FileInfo fi = new FileInfo(e.FullPath); // full name of path & file in the FSW directory
                string destFile = Path.Combine(targetPath, fi.Name);

                // To copy a folder's contents to a new location: 
                // Create a new target folder, if necessary. 
                if (!Directory.Exists(targetPath))
                    Directory.CreateDirectory(targetPath);

                // To copy a file to another location and  
                File.Copy(e.FullPath, destFile, true);

                // Set attribute to READONLY
                if (fi.IsReadOnly == false)
                    fi.Attributes = FileAttributes.ReadOnly;

                GetCruiseLineShipName(destFile, ref cruiseLine, ref shipName);

                using (StreamReader sr = new StreamReader(File.Open(destFile, FileMode.Open, FileAccess.Read, FileShare.Read)))
                {
                    filename = e.FullPath;

                    //How many lines should be loaded?
                    int NumberOfLines = 39;

                    //Read the number of lines and put them in the array
                    for (int i = 1; i < NumberOfLines; i++)
                    {
                        ListLines[i] = sr.ReadLine();
                        switch (i)
                        {
                            case 3:
                                int idx = ListLines[i].IndexOf(":");
                                string timeLine = ListLines[i].Substring(idx + 1);
                                dt = GetDate(Convert.ToDateTime(timeLine.Substring(1)));
                                break;

                            //more code here of the same                        
                        }
                    }
                    //InsertData into database                }
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("VendorStats", "Error in the Main:" + "\r\n\r\n" + ex.Message + "\r\n\r\n" + ex.InnerException);
                return;
            }
        }
4

1 回答 1

0

解决这个问题的底线是让方法(由 FileSystemWatcher 产生)休眠“X”秒,直到 Windows 将资源完全释放到先前和当前文件以及文件夹。

实际控制资源的是 FileSystemWatcher。

这是一些示例代码:

private static void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            try
            {
                Thread.Sleep(10000);

                GetCruiseLineShipName(e.FullPath, ref cruiseLine, ref shipName);

                using (StreamReader sr = new StreamReader(File.Open(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read)))
                { 
于 2012-12-19T18:26:44.990 回答