C # Сервис не перемещает файлы в нужную папку - PullRequest
0 голосов
/ 20 мая 2018

Я настроил службу 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;
            }
        }

1 Ответ

0 голосов
/ 22 мая 2018

После добавления дополнительного сообщения об исключении я получаю исключение ArgumentOutOfBounds.Я понял, что у меня было 26 элементов в моем разделе конфигурации версии 3, когда у меня должно было быть 23. После удаления последних 3 элементов все прошло гладко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...