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);
[...]
}
Другие вопросы по тегам