使用StreamReader对象无法使用Windows服务读取两个连续文件

时间:2012-12-18 18:24:48

标签: windows-7 windows-services streamreader filesystemwatcher

我需要能够在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;
            }
        }

1 个答案:

答案 0 :(得分:0)

解决这个问题的底线是将方法(由FileSystemWatcher生成)暂停“X”秒,直到Windows完全将资源释放到上一个和当前文件以及文件夹。 / p>

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)))
                {