为什么用' \ 0'?替换文件名中的无效字符?

时间:2016-07-20 08:11:34

标签: c# .net

我在同事的一个项目中偶然发现了这一点:

foreach (var invalidChar in Path.GetInvalidFileNameChars())
    fileName = fileName.Replace(invalidChar, '\0');

gerenal的想法很明显,但我想知道为什么他选择用null char替换无效字符而不是常规' char或只是一个空字符串。

我猜这个选择的理由很充分(写这篇文章的人是我们团队的老人),我只是想知道这个原因是什么。

3 个答案:

答案 0 :(得分:5)

在评论问题之后,我正在寻找证明文件名实际上不允许\ 0的证明。 I found it

  

使用当前代码页中的任何字符作为名称,包括扩展字符集(128-255)中的Unicode字符和字符,但以下情况除外:
     *以下保留字符:< (小于),> (大于),:(冒号)," (双引号),/(正斜杠),\(反斜杠),| (竖杆或竖管),? (问号),*(星号)
     * 整数值为零,有时也称为ASCII NUL字符。
     *整数表示形式在1到31范围内的字符,但允许使用这些字符的备用数据流除外。

答案 1 :(得分:2)

这取决于运行代码的OperationSystem。但在Windows上,char class TagType extends AbstractType { private function getTagsByCategoryName($categoryname) { return function(EntityRepository $er) { return $er->createQueryBuilder('t') ->innerJoin('t.categories', 'c', 'WITH', 'c.categoryname = :categoryname') ->setParameter('categoryname', $categoryname) ->orderBy('t.id', 'ASC'); } } public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('tagname', EntityType::class, array( 'class' => 'AppBundle:Tag', 'choices' => $this->getTagsByCategoryName('standard'), 'choice_label' => 'tagname', 'expanded' => false, 'multiple' => true, 'label' => 'Choose Tags', )); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'AppBundle\Entity\Tag', 'tags' => null, )); } } (0 as int)位于fileName的无效字符列表中。

LinqPad(在Windows 10上运行)

\0

我认为这段代码是从另一种语言移植到.net。

如果文件名包含无效的字符而不是用任何内容替换它,最好抛出异常(如果用户指定了名称)。

如果您需要更换它们,您应该选择一个字符,例如Path.GetInvalidFileNameChars().Contains('\0').Dump(); //true ,以明确可能有替换的内容。

答案 2 :(得分:0)

对于一些聪明人来说,没有empty char这样的东西。还应避免混淆空格(“”)和空字符串(“”)。