0

这是我的程序中的一个方法

public partial class Form1 : Form
{
    DirectoryInfo tempdirectory = new DirectoryInfo(@"\temp");
    const string DEFAULT_ADDRESS_TEXT = "<click load button to load a file>";

    private void Form1_Load(object sender, EventArgs e)
    {
        lblAddress.Text = DEFAULT_ADDRESS_TEXT;            
        if (Directory.Exists(tempdirectory.Name))
        {
            lblAddress.Text = tempdirectory.FullName;
            foreach (DirectoryInfo dir in tempdirectory.GetDirectories())
            {
                dir.Delete(true);
            }
            foreach (FileInfo file in tempdirectory.GetFiles())
            {
                file.Delete();
            }
        }
        Directory.CreateDirectory(tempdirectory.Name);
        lblAddress.Text = tempdirectory.Name;
    }
}

程序运行位置( PRL )--> G:\Users\\Documents\Visual Studio 2010\Projects\Comics Project\ZipEntryDemo2\ZipEntryDemo2\bin\Debug

在程序的第一次运行中,在程序位置 (PRL\temp) 会创建一个名为 temp 的文件夹。关闭应用程序并再次运行后,第一步创建的临时目录不为空;而是 lblAddress 显示值 G:\temp ;实际上甚至不存在。

然后我明确地创建了一个文件夹 G:\temp 并在其中放置了一些额外的文件和文件夹,出于测试目的,程序现在从 G:\temp 中删除所有文件和文件夹,并且 PRL\temp 仍然与所有内容保持原样。

实际上,我的程序将临时文件夹的位置,即 PRL\temp 传递给一个方法,该方法在该文件夹中提取它的内容。在每次运行中,内容总是在 PRL\temp 中提取;但 G:\temp 的内容会丢失,前提是该文件夹存在。

还有一个特殊的事情是,当我在第一次运行时调试时,因为临时目录在 PRL 中不存在,如果条件语句不执行并且程序在正确的位置创建一个文件夹,即 PRL\temp。只是检查了文件和文件夹是否有错误的文件夹 G:\temp

到目前为止,我没有收到任何异常,例如文件夹已经存在或任何类型。

我还注意到,如果我将“\temp”更改为“temp”,现在所有事情都发生在正确的位置,即 PRL\temp;并且中间没有 G:\temp 。我的程序运行良好。但我觉得这很奇怪,如果有人能解释一下,我将不胜感激。谢谢,对不起,如果这是一个非常愚蠢的问题,这是我第一次接触 IO 的经历。

调用解压缩方法的方​​法是

    private void btnLoad_Click(object sender, EventArgs e)
    {
        OpenFileDialog f = new OpenFileDialog();
        f.Filter = "Zip Files(*.zip)|*.zip";
        f.Multiselect = false;
        if (f.ShowDialog() == DialogResult.OK)
        {
            unzip(f.FileName, tempdirectory.Name, 4096); 
        }
    }

这里 tempDirectory.Name 被传递给 unzip 函数,它不会在该方法中被操纵。4096 是缓冲区大小,无关紧要。

4

2 回答 2

3

\temp将使用当前目录的根目录(在本例中为 G:)。

您应该使用Application.StartupPath()来获取应用程序的路径。然后Path.Combine(startupPath, tempPath)您可以使用它来创建和加载DirectoryInfo.

还可以考虑使用计算机环境的实际临时文件夹:

字符串 tmpFolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

对不起,应该是:

tmpFolder = System.IO.Path.GetTempPath;

此外,要删除文件夹中的所有文件,您可以使用以下方法:

IO.Directory.Delete(tmpFolder, true);
于 2012-10-21T12:18:38.823 回答
1

当您不指定完整路径名时,这些都是出错的事情。当您开始指定 plain 时temp,您得到了第一个“temp”目录,当您将其更改为\temp. 这仍然不是完整的路径名,因为它没有指定驱动器。

此代码也不太可能在您的开发机器以外的机器上存活,您不能在驱动器的根目录中任意创建目录。UAC 防止创建这样的目录和文件。你需要一个安装程序来创建这样的目录,只有它有足够的权限。

相反,Windows 程序应该使用 appdata 文件夹,您可以使用 Environment.GetFolderPath() 获取 appdata 目录的路径。如果这些文件夹和文件在本质上是真正的临时文件,换句话说,您只需要在整个过程中使用它们,或者在您再次启动时可以不使用它们,那么您应该使用 System.IO.Path.GetTempPath() 来获取用户临时目录的完整路径名。

于 2012-10-21T12:54:06.197 回答