使用StreamReader在Windows服务中由另一个进程使用的文件

时间:2012-12-17 22:15:43

标签: windows windows-services filesystemwatcher

我搜索了很多文章,尝试了几种不同的方法来解决这个问题。

请注意,此过程在控制台应用程序或具有完全相同代码的Windows应用程序中正常工作。所以,逻辑没有错。这就是Windows服务处理这些文件的方式,它不会让后续文件通过。

我尝试阅读一篇简单的文章来实际调试服务,但是我没有使用Visual Studio 2010在“调试”菜单下选择“附加到进程”。 的 http://msdn.microsoft.com/en-us/library/7a50syb3(V = VS.100)的.aspx

我真的需要一些帮助,因为我的选择确实用完了。

这是一个简单的场景: 我在OnStart方法中有一个FileSystemWatcher,它启动了另一种方法来处理本地机器上的文件。这些只是简单的txt文件。处理完第一个文件后,一切正常,我在事件日志中得到以下内容: 已成功为文件插入数据 20121212_AZM_Journey_MIS.txt

当我尝试处理后续文件(完全相同的格式,但名称与日期不同)时,我在事件日志中得到以下内容: 该进程无法访问文件'C:\ Projects \ Data \ VendingStats \ 20121213_AZM_Journey_MIS.txt',因为它正由另一个进程使用。

请注意,创建时会在同一目录中监视文件。

这是我的Windows服务中的代码。有人让我知道如何解决这个问题?请注意,e.FullPath在我的本地计算机上评估为“C:\ Projects \ Data \ VendingStats”。

    public partial class VendingStatsService : ServiceBase
        {

            public VendingStatsService()
            {
                InitializeComponent();
            }

            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
            {
                using (TextReader tr = new StreamReader(e.FullPath))
                {
                    // code here to insert data from file into a DB
                }
                Dispose();
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry("VendorStats", "Error in the Main:" + "\r\n\r\n" + ex.Message + "\r\n\r\n" + ex.InnerException);
                return;
            }
        }


        public void Dispose()
        {
            GC.Collect();
        }

0 个答案:

没有答案