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

プログラムの最初の実行時に、tempという名前のフォルダーがプログラムの場所(PRL \ 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での私の最初の経験のいくつかです。

unzipmethosを呼び出すメソッドは次のとおりです。

    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

これらは、フルパス名を指定しないとうまくいかないようなものです。プレーンを指定することから始めたときに最初の「temp」ディレクトリを取得し、tempそれをに変更したときに2番目の「temp」ディレクトリを取得しました\temp。ドライブを指定していないため、これはまだフルパス名ではありません。

また、このコードが開発マシン以外のマシンで存続する可能性は非常に低く、ドライブのルートにディレクトリを任意に作成することはできません。UACは、そのようなディレクトリやファイルの作成を防ぎます。このようなディレクトリを作成するにはインストーラーが必要ですが、十分な権限があるだけです。

代わりに、Windowsプログラムはappdataフォルダーを使用する必要があります。Environment.GetFolderPath()を使用してappdataディレクトリへのパスを取得します。これらのフォルダーとファイルが本当に一時的なものである場合、つまり、プロセスの存続期間中のみ必要であるか、再起動時にそれらがなくても実行できる場合は、System.IO.Path.GetTempPath()を使用してユーザーの一時ディレクトリの絶対パス名。

于 2012-10-21T12:54:06.197 に答える