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