ranio Ответов: 0

Как устранить исключение архивации файлов при перемещении файлов из исходной папки в целевую через службу windows в C#?


У меня есть исключение при архивировании файлов в корневой папке с подпапками через службу windows в c# . Я попробовал здесь с исходной папкой с 16 подпапками, и все эти папки перемещены, а файлы с ними заархивированы, которые удовлетворяют этому условию. Но на другом сервере за рубежом архив застрял после перемещения нескольких папок

У меня есть путь к исходной папке и путь к папке назначения, настроенные как показано ниже.

<add key="SourceFolderPath"  value="E:\Share\DDS_Rebex_Load\FileStore_From\"/>

   <add key="DestinationFolderPath"  value ="E:\Share\DDS_Rebex_Load\FileStore_To\"/>


Исходный путь будет содержать корневую папку и подпапки с файлами, и они будут заархивированы .

Что я уже пробовал:

Основной код выглядит следующим образом:
public bool CopyFolderContents(string SourcePath, string DestinationPath,int ArchivalAge)
{

    Archive AC = new Archive();
    try
    {

        string ServiceLogFileName = System.Configuration.ConfigurationSettings.AppSettings["ServiceLogPath"].ToString() + "SERVICE_LOG_" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
        AC.WriteTextFile(ServiceLogFileName, "Inside CopyFolderContents():" + DateTime.Now.ToString() + Environment.NewLine);

        SourcePath = SourcePath.EndsWith(@"\") ? SourcePath : SourcePath + @"\";
        DestinationPath = DestinationPath.EndsWith(@"\") ? DestinationPath : DestinationPath + @"\";

        if (Directory.Exists(SourcePath))
        {
            if (Directory.Exists(DestinationPath) == false)
            {
                Directory.CreateDirectory(DestinationPath);
            }

            foreach (string file in Directory.GetFiles(SourcePath))
            {
                  DateTime FromDateTime = DateTime.Now.AddDays(ArchivalAge);
                  //DateTime FromDate = Convert.ToDateTime(FromDateTime.ToString("yyyy/MM/dd"));
                  DateTime dtFileCreatedDate = File.GetCreationTime(file);

                  if (dtFileCreatedDate.Date <= FromDateTime.Date)
                  {
                      FileInfo fileInfo = new FileInfo(file);

                      //fileInfo.CopyTo(string.Format(@"{0}\{1}", DestinationPath, fileInfo.Name), true);

                      string SourceFilePath = file;
                      string DestinationFilePath = DestinationPath + Path.GetFileName(file);


                      if (!File.Exists(DestinationFilePath))
                      {
                          File.Move(SourceFilePath, DestinationFilePath);
                          //FileCount = FileCount + 1;
                      }

                  }
            }

            foreach (string drs in Directory.GetDirectories(SourcePath))
            {
                DirectoryInfo directoryInfo = new DirectoryInfo(drs);
                if (CopyFolderContents(drs, DestinationPath + directoryInfo.Name,ArchivalAge) == false)
                {
                    return false;
                }
            }
        }
        return true;
    }
    catch (Exception ex)
    {

        string ErrorLogFileName = System.Configuration.ConfigurationSettings.AppSettings["ErrorLogPath"].ToString() + "SERVICE_LOG_" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
        AC.WriteTextFile(ErrorLogFileName, "Inside File Archival- CopyFolderContents():" + DateTime.Now.ToString() + Environment.NewLine);
        return false;
    }
}

Richard MacCutchan

Какое исключение было сделано, и каковы были детали?

ranio

исключение, которое я получил, заключается в том, что процесс не может получить доступ к файлу, потому что он уже используется другим процессом в журнале ошибок. Код для того же самого сделано, как показано ниже:

общественная bool CopyFolderContents(строковый параметр sourcepath, строка назначение путь,инт ArchivalAge)
{

Архив AC = новый архив();
пробовать
{

строка ServiceLogFileName = System.Конфигурация.Конфигурационные настройки.AppSettings["ServiceLogPath"].ToString() + "SERVICE_LOG_" + DateTime.Now.ToString("гггг-ММ-ДД") + ".txt";
AC.WriteTextFile(ServiceLogFileName, "Inside CopyFolderContents():" + DateTime.Now.ToString() + Environment.NewLine);

SourcePath = SourcePath.EndsWith(@"\") ? Источник : Источник + @"\";
DestinationPath = DestinationPath.EndsWith(@"\") ? Назначение Путь : Назначение Путь + @"\";

если (справочник.Существует(Источник))
{
if (Directory.Exists(DestinationPath) == false)
{
Каталог.CreateDirectory(DestinationPath);
}

foreach (строковый файл в каталоге.Заражен(Источник))
{
DateTime FromDateTime = DateTime.Now.AddDays(Архивация);
//DateTime FromDate = Конвертировать.Объект Todatetime(FromDateTime.ToString("гггг/ММ/ДД"));
DateTime dtFileCreatedDate = файл.GetCreationTime(файл);

if (dtFileCreatedDate.Дата <= FromDateTime.Date)
{
FileInfo fileInfo = новый FileInfo(файл);

//fileInfo.CopyTo(строка.Формат(@"{0}\{1}", Путь назначения, fileInfo.Name), правда);

строка SourceFilePath = файл;
строка DestinationFilePath = DestinationPath + Path.GetFileName(file);


если (!файл.Существует(DestinationFilePath))
{
Файл.Move(SourceFilePath, DestinationFilePath);
//FileCount = FileCount + 1;
}

}
}

foreach (строка drs в каталоге.GetDirectories(SourcePath))
{
DirectoryInfo directoryInfo = новый DirectoryInfo(drs);
if (CopyFolderContents(drs, DestinationPath + directoryInfo.Name,Архиваж) == ложь)
{
возвращать false;
}
}
}
вернуть true;
}
поймать (исключение бывший)
{

строка ErrorLogFileName = System.Конфигурация.Конфигурационные настройки.AppSettings["ErrorLogPath"].ToString() + "SERVICE_LOG_" + DateTime.Now.ToString("гггг-ММ-ДД") + ".txt";
AC.WriteTextFile(ErrorLogFileName, "Inside File Archival - CopyFolderContents():" + DateTime.Now.ToString() + Environment.NewLine);
возвращать false;
}
}

0 Ответов