Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当目录存在时,ZipFile.ExtractToDirectory是否引发异常?_C#_.net_.net Core_.net 5 - Fatal编程技术网

C# 当目录存在时,ZipFile.ExtractToDirectory是否引发异常?

C# 当目录存在时,ZipFile.ExtractToDirectory是否引发异常?,c#,.net,.net-core,.net-5,C#,.net,.net Core,.net 5,根据,如果要提取zip文件的目标目录已经存在,则程序应该抛出一个IOException。此外,“备注”部分说,“目标目录不能已经存在。” 即使输出作为目录存在,也可以正常工作(无异常)。差不多 ZipFile.ExtractToDirectory("archive.zip", "\\"); 也可以毫无例外地工作。所以,我试图理解为什么在微软文档明确建议应该有例外的情况下,没有例外 注意:我正在运行.NET 5。看起来像是文档错误。我为此打开了两个GitH

根据,如果要提取zip文件的目标目录已经存在,则程序应该抛出一个
IOException
。此外,“备注”部分说,“目标目录不能已经存在。”

即使
输出作为目录存在,也可以正常工作(无异常)。差不多

ZipFile.ExtractToDirectory("archive.zip", "\\");
也可以毫无例外地工作。所以,我试图理解为什么在微软文档明确建议应该有例外的情况下,没有例外


注意:我正在运行.NET 5。

看起来像是文档错误。我为此打开了两个GitHub版本,这是从它们创建的

.NETCore是开源的,这意味着我们可以检查实际的源代码以了解发生了什么

实际调用该方法:

如果目标目录存在,则不会引发In-IOException,即使文档站点这样说:

/// <exception cref="IOException">An archive entry?s name is zero-length, contains only whitespace, or contains one or more invalid
/// characters as defined by InvalidPathChars. -or- Extracting an archive entry would have resulted in a destination
/// file that is outside destinationDirectoryName (for example, if the entry name contains parent directory accessors).
/// -or- An archive entry has the same name as an already extracted entry from the same archive.</exception>
public static void ExtractToDirectory(this ZipArchive source, string destinationDirectoryName, bool overwriteFiles)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    if (destinationDirectoryName == null)
        throw new ArgumentNullException(nameof(destinationDirectoryName));

    foreach (ZipArchiveEntry entry in source.Entries)
    {
        entry.ExtractRelativeToDirectory(destinationDirectoryName, overwriteFiles);
    }
}
重点是:

//请注意,即使存在destinationDirectoryName,这也将为我们提供良好的DirectoryInfo


@PranavHosangadi根据微软文档,应该有一个例外,所以是的,我在问为什么没有一个例外。@zaggler这两个是分开的examples@PranavHosangadiOP询问的是文件夹,而不是文件。你的小提琴实际上证明了OP的观点。如果在第一个
提取之前创建
mytest
,则代码仍然works@PanagiotisKanavos你说得对。问题是:OP的问题是可重复的。(FWIW,VTC不可复制不是我的)我怀疑这样的事情。谢谢你的检查。那么,如果这真的是一个文档错误,有没有办法向Microsoft报告呢?你可以做得更好,@bjorn93,应该有一个可以自己单击并编辑它的窗口。@HereticMonkey这只在Github上打开文件,不允许你实际编辑它。不过,这是一个打开问题的好地方。我已经知道了
public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, Encoding? entryNameEncoding, bool overwriteFiles)
{
    if (sourceArchiveFileName == null)
        throw new ArgumentNullException(nameof(sourceArchiveFileName));

    using (ZipArchive archive = Open(sourceArchiveFileName, ZipArchiveMode.Read, entryNameEncoding))
    {
        archive.ExtractToDirectory(destinationDirectoryName, overwriteFiles);
    }
}
/// <exception cref="IOException">An archive entry?s name is zero-length, contains only whitespace, or contains one or more invalid
/// characters as defined by InvalidPathChars. -or- Extracting an archive entry would have resulted in a destination
/// file that is outside destinationDirectoryName (for example, if the entry name contains parent directory accessors).
/// -or- An archive entry has the same name as an already extracted entry from the same archive.</exception>
public static void ExtractToDirectory(this ZipArchive source, string destinationDirectoryName, bool overwriteFiles)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    if (destinationDirectoryName == null)
        throw new ArgumentNullException(nameof(destinationDirectoryName));

    foreach (ZipArchiveEntry entry in source.Entries)
    {
        entry.ExtractRelativeToDirectory(destinationDirectoryName, overwriteFiles);
    }
}
internal static void ExtractRelativeToDirectory(this ZipArchiveEntry source, string destinationDirectoryName, bool overwrite)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    if (destinationDirectoryName == null)
        throw new ArgumentNullException(nameof(destinationDirectoryName));

    // Note that this will give us a good DirectoryInfo even if destinationDirectoryName exists:
    DirectoryInfo di = Directory.CreateDirectory(destinationDirectoryName);
      ...