DirectoryNotFoundException при запуске с компьютеров, отличных от сервера в C#
Я разработал консольное приложение, которое архивирует файлы в каталоге с паролем к папке назначения. Я заархивирую файлы в каталоге в папку назначения с паролем.
Это код. На моем локальном ПК все работает нормально. Я создал программу установки для этого приложения и установил на свой ПК, а также на другие ПК. В моем ПК работает нормально. но на других ПК это дает исключение. Подскажите пожалуйста, в чем может быть проблема и как мне ее решить? Это проблема, связанная с разрешением, или какая-то другая проблема?
{
int codePage = 0;
ZipEntry e = null;
string entryComment = null;
string entryDirectoryPathInArchive = "";
string strFullFilePath = "";
using (ZipFile zip = new ZipFile())
{
//zip.ExtractExistingFile= ExtractExistingFileAction.OverwriteSilently;
// zip.ExtractAll(Environment.CurrentDirectory, .OverwriteSilently);
//var result = zipFile.Any(entry => entry.FileName.EndsWith("input.txt"));
zip.StatusMessageTextWriter = System.Console.Out;
zip.UseUnicodeAsNecessary = true;
for (int i = 0; i < args.Length; i++)
{
switch (args[i])
{
case "-p":
i++;
if (args.Length <= i) Usage();
zip.Password = (args[i] == "") ? null : args[i];
break;
case "-flat":
entryDirectoryPathInArchive = "";
break;
//case "-utf8":
// zip.UseUnicodeAsNecessary = true;
// break;
case "-64":
zip.UseZip64WhenSaving = Zip64Option.Always;
break;
case "-d":
i++;
if (args.Length <= i) Usage();
string entryName = args[i];
if (!System.IO.Directory.Exists(args[i]))
{
System.IO.Directory.CreateDirectory(args[i]);
//System.Console.Error.WriteLine("Path ({0}) does not exist.", strFullFilePath);
//m_log.Error("Destination Path "+strFullFilePath+" does not exist.");
}
System.DateTime Timestamp = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
string strFileName = Timestamp.ToShortDateString();
strFullFilePath = args[i] + strFileName + ".zip";
break;
case "-c":
i++;
if (args.Length <= i) Usage();
entryComment = args[i]; // for the next entry
break;
case "-zc":
i++;
if (args.Length <= i) Usage();
zip.Comment = args[i];
break;
case "-cp":
i++;
if (args.Length <= i) Usage();
System.Int32.TryParse(args[i], out codePage);
if (codePage != 0)
zip.ProvisionalAlternateEncoding = System.Text.Encoding.GetEncoding(codePage);
break;
case "-s":
i++;
if (args.Length <= i) Usage();
zip.AddDirectory(args[i], args[i]);
//entryDirectoryPathInArchive = args[i];
break;
default:
// UpdateItem will add Files or Dirs, recurses subdirectories
//zip.UpdateItem(args[i], entryDirectoryPathInArchive);
// try to add a comment if we have one
if (entryComment != null)
{
// can only add a comment if the thing just added was a file.
if (zip.EntryFileNames.Contains(args[i]))
{
e = zip[args[i]];
e.Comment = entryComment;
}
else
Console.WriteLine("Warning: ZipWithEncryption.exe: ignoring comment; cannot add a comment to a directory.");
// reset the comment
entryComment = null;
}
break;
}
}
zip.Save(strFullFilePath);
}
}
Это сообщения об исключениях
Saving....
Exception: System.IO.DirectoryNotFoundException: Could not find a part of the pa
th.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.Move(String sourceFileName, String destFileName)
at Ionic.Zip.ZipFile.Save()
at Ionic.Zip.ZipFile.Save(String zipFileName)
at Ionic.Zip.Examples.ZipWithEncryption.Main(String[] args)
Exception:
Exception: Could not find a part of the path.
Exception: mscorlib
Exception: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullP
ath)
at System.IO.File.Move(String sourceFileName, String destFileName)
at Ionic.Zip.ZipFile.Save()
at Ionic.Zip.ZipFile.Save(String zipFileName)
at Ionic.Zip.Examples.ZipWithEncryption.Main(String[] args)
Exception: Void WinIOError(Int32, System.String)
1 ответ
Я думаю, что этот код странный:
System.DateTime Timestamp = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
string strFileName = Timestamp.ToShortDateString();
strFullFilePath = args[i] + strFileName + ".zip";
Во-первых, вы можете написать
DateTime Timestamp = DateTime.Now;
затем ToShortDateString
зависит от CurrentCulture. Заставь что хочешь (например:)
String strFileName = Timestamp.ToString("yyyyMMdd");
Исключение отсюда, на мой взгляд. При неправильной культуре вы можете иметь "/" в строке формата.
Затем используйте Path.Combine
вместо оператора + (без ошибки с отсутствующим слешем)
strFullFilePath = Path.Combine(args[i], strFileName + ".zip");
Редактировать Для тех, кто не может отформатировать DateTime, вот мой код (и это работает):
public static class Constantes
{
public const String DateTimePattern = "yyyyMMddHHmmss";
}
public class SaveProcessViewModel : NotificationObject
{
[...]
String zipFileName = System.Environment.MachineName + "-" + DateTime.Now.ToString(Constantes.DateTimePattern) + ".zip";
String tempZipFile = Path.Combine(Path.GetTempPath(), zipFileName);
zip.Save(tempZipFile);
[...]
}