如何使用相对路径压缩文件

时间:2014-11-06 19:40:49

标签: c# dotnetzip

我正在尝试用C#编写一个小备份工具。我想要备份(和zip)的文件存储如下:

C:\ 1 \ 2 \ 3 \文件\ backupfile1.txt C:\ 1 \ 2 \ 3 \文件\ backupfile2.txt

但也喜欢这样:

C:\ 1 \ 2 \ 3 \文件\ 1 \ backupfile3.txt

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

C:\ 1 \文件\ backupfile1.txt C:\ 1 \文件\ 1 \ backupfile3.txt

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

编辑: 显示复选框列表的功能如下所示:

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);
            }
        }

1 个答案:

答案 0 :(得分:0)

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

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
   }
}