Path.GetExtension(file.FileName) 给出可能的 Nullreference 警告

Posted

技术标签:

【中文标题】Path.GetExtension(file.FileName) 给出可能的 Nullreference 警告【英文标题】:Path.GetExtension(file.FileName) gives possible Nullreference warning 【发布时间】:2011-12-20 04:30:46 【问题描述】:

当我添加".ToLowerInvariant()"Path.GetExtension(file.FileName),ReSharper 会针对可能的 Nullreference 异常发出警告。

我已尝试关注,但警告不会消失。我错过了什么?

if (file != null && Path.GetExtension(file.FileName) != null)
            
                switch (Path.GetExtension(file.FileName).ToLowerInvariant())
                
                    case ".jpg":
                    case ".png":
                    case ".gif":
                    case ".jpeg":
                        break;
                    default:
                        break;

                

【问题讨论】:

尝试给出文件 Path.GetExtension(fullpath) 的完整路径。还要检查路径是否为空 【参考方案1】:

因为在 Path.GetExtension() 的结果中调用了 ToLowerInvariant()。无法保证 Path.GetExtension() 将返回任何有意义的内容(例如,如果 file.Filename 为 null)。

最好先检查 Path.GetExtension 的结果是否为空,然后再调用其他任何内容。 (或在将文件名放入 GetExtension 之前调用文件名上的 ToLower(),无论哪种方式,请确保您确切知道要放入 GetExtension() 中的内容,否则您无法保证得到的内容将是您所追求的)。

【讨论】:

【参考方案2】:

所以MSDN says GetExtension 只会在你传入一个为空的 FileName 时返回 null。

指定路径的扩展名(包括句点“.”),或 Nothing[Null],或 String.Empty。如果路径是 Nothing[Null],GetExtension 返回 无[空]。如果路径没有扩展信息,GetExtension 返回 String.Empty。

如果你先检查if (file != null && file.FileName != null),你是安全的。

您还可以使 reshaper 警告消失

if (file != null) 

    string extension = Path.GetExtension(file.FileName);
    if (extension != null) //will be null if file.FileName is null
    
        switch(extension.ToLowerInvariant())
         
          //..snip
        
    

【讨论】:

添加一个从未满足的条件对我来说听起来像是一个可疑的设计选择。您还使用 ToLower 而不是 ToLowerInvariant 添加了一个错误 @CodeInChaos 同意了。修改为删除冗余检查。【参考方案3】:

听起来像是一个错误的警告。

所以听起来 ReSharper 不明白 Path.GetExtension(file.FileName) 在您的测试和它在 ToLowerInvariant 中使用的时间之间没有变化。

【讨论】:

【参考方案4】:

这是一个更清晰的警告,您只需要检查空值即可。

这是一个例子:

var extension = Path.GetExtension(myFile.FileName);

if (extension == null || extension.ToLower() != ".jpg")

    lblOutput.Text = @"The file must have an extension of JPG";
    return;

【讨论】:

【参考方案5】:

好吧,我遇到了同样的问题,简单的解决方法是

确保您的 .cshtml 文件中包含表单发布方法

enctype="multipart/form-data"

<form method="post" asp-for="Upsert" enctype="multipart/form-data">

【讨论】:

以上是关于Path.GetExtension(file.FileName) 给出可能的 Nullreference 警告的主要内容,如果未能解决你的问题,请参考以下文章

C# 保存文件如有重名在原名后加(*)

C# 一些知识点总结

我可以为 System.IO.Path 类创建扩展方法吗? [复制]

C#对文件/目录的操作:PathFileDirectoryFileStreamStreamWriterStreamReader等类的浅析

获取文件的后缀名 和 Process进程

还在用分割字符获取文件名等信息吗?