我已使用xml配置文件配置了Windows服务。该服务应该根据文件中的字段数确定csv文件所在的文件夹。字段数也决定了生成文件的软件版本,无论是版本3还是版本4.版本3 csv文件应该在它们自己的文件夹中进行,并且在版本4进行整理之前应该相同。目前这两个版本都是混合的,因此,整理过程会被破坏,并且Windows服务不会处理多个文件。以下是代码段的示例。当我运行Windows服务并检查事件查看器时,我不断收到catch语句中的错误 - “检查csv文件时出错”并将文件移动到异常文件夹而不是正确的文件夹。任何见解将不胜感激。
配置文件
<dip>
<versions>
<version number="4">
<location path="C:\xRS\Output" />
<numberOfFields>26</numberOfFields>
<orderedfields>
<type>string</type>
<type>int</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>currency</type>
<type>string</type>
<type>currency</type>
<type>string</type>
<type>currency</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
</orderedfields>
</version>
<version number="3">
<location path="C:\xRS\Output" />
<numberOfFields>23</numberOfFields>
<orderedfields>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>currency</type>
<type>string</type>
<type>currency</type>
<type>string</type>
<type>currency</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
<type>string</type>
</orderedfields>
</version>
</versions>
</dip>
检查CSV文件是否有特殊字符,并检查
生成的版本private Boolean CheckCsvFile(String currentFile)
{
bool result = false;
//bool proceed = false;
int typeIndex;
string currentLineValue;
try
{
string[] line = File.ReadAllLines(currentFile);
if (line.Length > 0)
{
//remove all quotes
line[0] = Regex.Replace(line[0], "\"", String.Empty);
String[] lineValues = line[0].Split('\t');
//proceed = true;
eventLog1.WriteEntry("There are " + lineValues.Length + " columns in file");
XmlDocument dipConfig = new XmlDocument();
dipConfig.Load("DipConfig.xml");
foreach (XmlNode versions in dipConfig.DocumentElement.ChildNodes)
{
// string nodename = versions.Name;
foreach (XmlNode versionNode in versions)
{
typeIndex = 0;
// nodename = versionNode.Name;
string versionNumber = versionNode.Attributes["number"].InnerText;
string locationPath = versionNode.ChildNodes[0].Attributes["path"].InnerText;
string numberOfFields = versionNode.ChildNodes[1].InnerText;
eventLog1.WriteEntry(String.Format("Processing version {0} with {1} number of fields", versionNumber, numberOfFields));
//if the number of fields for the version matches the columns from the line
if (int.Parse(numberOfFields) == lineValues.Length)
{
//check each value
foreach (XmlNode typeNode in versionNode.ChildNodes[2])
{
currentLineValue = lineValues[typeIndex];
//if the line value is not empty checked the field type
if (!String.IsNullOrEmpty(currentLineValue))
{
if ("int".Equals(typeNode.InnerText.ToLower()))
{
int value;
int.TryParse(currentLineValue, out value);
lineValues[typeIndex] = value.ToString();
}
if ("currency".Equals(typeNode.InnerText.ToLower()))
{
lineValues[typeIndex] = Regex.Replace(currentLineValue, " ", String.Empty);
}
}
typeIndex++; // increment the index
}
// write back the editted array to the current file
//construct the string
String EditedLine = String.Empty;
for (int i = 0; i < lineValues.Length; i++)
{
EditedLine = @"\t" + lineValues[i];
}
try
{
File.WriteAllText(currentFile, EditedLine);
}
catch
{
eventLog1.WriteEntry("Error writing contents back to csv file");
}
result = true;
break; // break foreach loop
}
} //End For each version
} //End For Loop [versions]
}
return result;
}
catch (Exception ex)
{
eventLog1.WriteEntry("Erroe while checking CSV file");
return result;
}
}
答案 0 :(得分:0)
添加其他异常消息后,我收到了ArgumentOutOfBounds异常。我意识到我的版本3配置部分中有26个元素,当我应该有23个。删除最后3个元素后,一切顺利。