directoryInfo.Name同时显示不同的值

时间:2012-10-21 12:12:38

标签: c# io directory

以下是我的程序中的方法

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 ) - &gt; 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 \ temp,则PRL不存在。 只是检查文件和文件夹的错误文件夹G:\ temp

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

我还注意到如果我将“\ temp”更改为“temp”,现在所有事情都发生在正确的位置,即PRL \ temp;中间没有G:\ temp。我的程序运行正常。但我发现它很奇怪,如果有人可以解释,我会很感激。谢谢,对不起,如果这是一个非常愚蠢的问题,这是我对IO的第一次体验。

调用unzip方法的方法是

    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是缓冲区大小,无关紧要。

2 个答案:

答案 0 :(得分:3)

\temp将使用当前目录的根目录(在这种情况下为G:)。

您应该使用Application.StartupPath()来获取应用程序的路径。 然后使用Path.Combine(startupPath, tempPath) DirectoryInfo创建并加载tmpFolder = System.IO.Path.GetTempPath;

另请考虑使用计算机环境的实际临时文件夹:

string tmpFolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

抱歉,应该是:

IO.Directory.Delete(tmpFolder, true);

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

{{1}}

答案 1 :(得分:1)

当您未指定完整路径名时,会出现这些问题。当你开始指定普通temp时,你得到了第一个“临时”目录,当你将其改为\temp时,第二个目录。这仍然不是完整路径名,因为它没有指定驱动器。

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

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