【问题标题】:directoryInfo.Name shows diffrent value at the same timedirectoryInfo.Name 同时显示不同的值
【发布时间】:2012-10-21 12:12:37
【问题描述】:

这是我程序中的一个方法

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\temp)创建一个文件夹,则在 PRL 中不存在临时目录。 只是检查文件和文件夹是否有错误的文件夹 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 是缓冲区大小,无关紧要。

【问题讨论】:

  • 是的,我知道代码会在没有 try-catch 块的情况下在许多机器上中断,但这只是一个提取文件的测试程序。我的问题是为什么它会删除一个文件夹的内容并提取到正确的文件夹中。

标签: c# io directory


【解决方案1】:

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

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

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

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

对不起,应该是:

tmpFolder = System.IO.Path.GetTempPath;

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

IO.Directory.Delete(tmpFolder, true);

【讨论】:

  • 是的,我检查了那个额外的斜线,但问题是为什么我的工作文件夹仍然是程序的临时目录。我最初使用 Environment.CurrentDirectory 保存,但更改为这种形式。
  • \ 将强制转到根目录。 CD 不一定与程序文件夹相同。如果你通过 f.ex.资源管理器到程序文件夹并从那里启动 exe,CD 最初将与程序文件夹相同。但是,如果您从链接(即快捷方式)或相对路径开始,CD 很可能与程序文件夹不同。 Application.StartupPath 将保证您获得程序启动路径(使用 Env..SetCD 将要求您知道程序启动路径)。但是对于临时文件,环境 temp 是更好的选择 IMO。
  • 好的,现在我还不知道。至于临时路径,其实这只是一个测试程序。我最初的问题是为什么它显示不同的值。
【解决方案2】:

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

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

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

【讨论】:

  • “你不能在驱动器的根目录下任意创建目录”,不知道,谢谢!
猜你喜欢
  • 2018-06-11
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多