foreach (var invalidChar in Path.GetInvalidFileNameChars())
fileName = fileName.Replace(invalidChar, '\0');
gerenal的想法很明显,但我想知道为什么他选择用null char替换无效字符而不是常规' char或只是一个空字符串。
我猜这个选择的理由很充分(写这篇文章的人是我们团队的老人),我只是想知道这个原因是什么。
答案 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这样的东西。还应避免混淆空格(“”)和空字符串(“”)。