以下是我的程序中的方法
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是缓冲区大小,无关紧要。
答案 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()来获取用户临时目录的完整路径名。