【问题标题】:How to zip files with relative path如何使用相对路径压缩文件
【发布时间】:2014-11-06 19:40:48
【问题描述】:

我正在尝试用 C# 编写一个小备份工具。我要备份(和压缩)的文件是这样存储的:

c:\1\2\3\files\backupfile1.txt c:\1\2\3\files\backupfile2.txt

但也像这样:

c:\1\2\3\files\1\backupfile3.txt

用户必须指定路径“C:\1\2\3”。我的程序现在搜索所有子目录并将其放入一个数组中。之后,它会在带有复选框的列表中显示所有条目的列表。然后用户必须检查他想要保存哪些文件。 当按下“保存”按钮时,所有检查的文件都存储在一个 zip 文件中,但具有完整的路径名。当我想在另一个系统上恢复它们​​时,这是一个问题,因为文件夹可能不同。目的地可能如下所示:

C:\1\files\backupfile1.txt C:\1\files\1\backupfile3.txt

所以我的问题是,相对于用户必须指定的路径,我必须将部分文件夹存储在 zip 中。由于我对像这样的复杂程序只有很少的经验,所以我迷路了。 我已经看到可以拆分字符串。我认为有可能读取所有文件,然后在压缩它们之前,在每个 \ 处拆分路径并删除“文件”目录之前的每个部分,然后用这个拆分目录压缩所有内容,但我不知道如何。 这是可能的还是有更简单的方法来做到这一点? 重要的是“文件”文件夹之后的文件夹结构必须保持不变。

编辑: 显示复选框列表的函数如下所示:

private void bt_aktualisieren_Click(object sender, EventArgs e)
        {
            string folder = Properties.Settings.Default.folder;
            string[] directories = folder.Split(Path.DirectorySeparatorChar);
            bool temp = false;

            for (int i = 0; i < directories.Count(); i++)
            {
                if (directories[i] == "files")//files is your Directory with files and subdirs which you want to backup
                    temp = true;
            }
            if (temp == true)
            {
                string[] files = (from f in Directory.GetFiles(@folder += "\\backup", "*", SearchOption.AllDirectories)
                                    where f.EndsWith(".txt")
                                    select f).ToArray();
                                    checkedListBox1.Items.AddRange(files);
            }
        }

【问题讨论】:

    标签: c# dotnetzip


    【解决方案1】:

    您可以使用以下方式分割路径:

    string[] directories = path.Split(Path.DirectorySeparatorChar);
    

    然后您可以检查“文件文件夹”的数组以及“文件文件夹”之后的所有目录名称都可以在您的文件名中。

    编辑:

    样品 - 未测试

    string mypath = c:\1\2\3\files\backupfile1.txt
    string[] directories = mypath.Split(Path.DirectorySeparatorChar);
    
    directories[0] = C:
    directories[1] = 1
    direcotries[2] = 2
    

    等等……

    bool temp = false;
    
    for(int i = 0; i<directories.Count(); i++)
    {
       if(directories[i] == "files")//files is your Directory with files and subdirs which you want to backup
          temp = true;
       }
       if(temp == true)
       {
          // ADD directories[i] to checkbox list
       }
    }
    

    【讨论】:

    • 这听起来很完美!你能举个例子吗?我对这一切真的很陌生......
    • 这看起来不错,但我遇到了一个小问题:错误 1 ​​Operator '
    • 哦,错过了 '.Count' 后面的 '()' 因为 Enumerable.Count 是一个方法。
    • 看起来很有希望,但遗憾的是复选框列表保持为空:(
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2021-02-13
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多