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