Как устранить исключение архивации файлов при перемещении файлов из исходной папки в целевую через службу 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;
}
}