Я настроил службу Windows, используя конфигурационный файл xml.Служба должна определять, в какую папку отправляется CSV-файл, в зависимости от количества полей в файле.Количество полей также определяет, какая версия программного обеспечения сгенерировала файл, будь то версия 3 или версия 4. Файлы CSV версии 3 должны идти в свою собственную папку и то же самое для версии 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;
}
}