:20:S10734539/940
正在读取文件夹中的swift消息,并且在第20行:我执行某种验证以了解文件和读取是否有效。在这种情况下,如果line:20:中包含940,则Windows服务会在完成后读取并将其移动到成功文件夹。但是无效文件将不会有940在线:20:,Windows服务旨在将无效文件移动到无效的文件位置。我已经编写了一个代码来执行此操作,但它无法移动文件。我收到一条错误消息“正在使用中的文件”,找到我的代码的片段。
if (Directory.Exists(@CBN_INFLOW940))
DirectoryInfo dr = new DirectoryInfo(CBN_INFLOW940);
FileInfo[] fi = dr.GetFiles();
string[] files = Directory.GetFiles(CBN_INFLOW940);
int lengthchk = 0;
if (files.Length < 1)
check = false;
while (files.Length > lengthchk)
{
StringBuilder sb = new StringBuilder();
logger.Info(fi[lengthchk].Name + ": read from folder");
string narrationgen = "";
bool isvalidrtgs = false;
DateTime createddate = fi[lengthchk].CreationTime.Date;
FileStream stream = null;
try
{
stream = File.Open(files[lengthchk], FileMode.Open, FileAccess.ReadWrite, FileShare.None);
StreamReader sf = new StreamReader(stream);
}
和
if (line.Contains(":20:"))
{
firstchk = 1;
if (!line.Contains('/'))
{
string[] fnamesplit = fi[lengthchk].Name.Split('.');
string newfname = fnamesplit[0] + "_bk" + ".txt";
string destlocation = Invalidfilelocation940 + newfname;
string sourcelocation = CBN_INFLOW940 + fi[lengthchk]; // + "\\"
File.Move(sourcelocation, destlocation);
return;
}
string[] narr = line.Split('/');
string filecode = narr[1];
if (filecode.Trim() != "940")
{
string[] fnamesplit = fi[lengthchk].Name.Split('.');
string newfname = fnamesplit[0] + "_bk" + ".txt";
string destlocation = Invalidfilelocation940 + newfname;
string sourcelocation = CBN_INFLOW940 + "\\" + fi[lengthchk];
File.Move(sourcelocation, destlocation);
return;
}
}
答案 0 :(得分:1)
问题可能是你打开文件进行读写。
stream = File.Open(files[lengthchk], FileMode.Open, FileAccess.ReadWrite, FileShare.None);
此处的Access文件是杀手FileAccess.ReadWrite
如果你打开它只是为了阅读你可以移动它,但实际上,当你读完文件后,你应该在尝试移动它之前关闭它。
理想情况下,您需要一种方法来检查文件是否需要移动,另一种方法来执行移动。
答案 1 :(得分:0)
尝试从移动代码中拆分检查代码。这将是一个更好的设计,而且当你试图移动它时,你可能会锁定文件以供阅读。
想:
if ( ShouldMoveFile( filename ) )
{
File.Move...
}
并确保关闭正在阅读的文件。
如果保持代码相同:
添加以下行:
sf.Close();
stream.Close();
在你移动文件之前。