Как я разрешаю каноническое имя файла в Windows?

Понимание этого является плохой идеей, я записал, что этот regex в жемчуге - вот что работавший лучшее для меня. Я уже отфильтровал названия компаний.
Вывод в формате vcard: (hon_prefix, given_name, additional_name, family_name, почтенный суффикс)

/^ \s*
    (?:((?:Dr.)|(?:Mr.)|(?:Mr?s.)|(?:Miss)|(?:2nd\sLt.)|(?:Sen\.?))\s+)? # prefix
    ((?:\w+)|(?:\w\.)) # first name
(?: \s+ ((?:\w\.?)|(?:\w\w+)) )?  # middle initial
(?: \s+ ((?:[OD]['’]\s?)?[-\w]+))    # last name
(?: ,? \s+ ( (?:[JS]r\.?) | (?:Esq\.?) | (?: (?:M)|(?:Ph)|(?:Ed) \.?\s*D\.?) | 
         (?: R\.?N\.?) | (?: I+) )  )? # suffix
\s* $/x

примечания:

  • не обрабатывает IV, V, VI
  • Трудно кодированные списки префиксов, суффиксов. развитый из набора данных имен ~2K
  • не обрабатывает несколько суффиксов (например, MD, доктор философии)
  • Разработанный для американских имен - не будет работать правильно над романизировавшими японскими именами или другими системами именования
9
задан dthrasher 29 November 2009 в 20:38
поделиться

4 ответа

Short answer: not really.

There is no simple way to get the canonical name of a file on Windows. Local files can be available via reparse points, via SUBST. Do you want to deal with NTFS junctions? Windows shortcuts? What about \\?\-escaped filenames

Remote files can be available via mapped drive letter or via UNC. Is that the UNC to the origin server? Are you using DFS? Is the server using reparse points, etc.? Is the server available by more than one name? What about the IP address? Does it have more than one IP address?

So, if you're looking for something like the inode number on Windows, it ain't there. See, for example, this page.

9
ответ дан 4 December 2019 в 11:05
поделиться

Роджер прав, простого пути нет. Если том поддерживает файл с уникальным индексом файла, вы можете открыть файл и вызвать GetFileInformationByHandle , но это не будет работать на всех томах.

Вызов Windows API GetFullPathName может быть лучший простой подход.

4
ответ дан 4 December 2019 в 11:05
поделиться

jheddings дает хороший ответ, но поскольку вы не указали, какой язык вы используете, я подумал, что дам способ Python, который также работает из командной строки, используя os.path.abspath :

> python -c "import os.path; print os.path.abspath('C:\stuff\things\etc\misc\other\..\whatever.txt')"
C:\stuff\things\etc\misc\whatever.txt
1
ответ дан 4 December 2019 в 11:05
поделиться

Using FileInfo (example in C#):

FileInfo info1 = new FileInfo(@"C:\stuff\things\etc\misc\whatever.txt");
FileInfo info2 = new FileInfo(@"C:\stuff\things\etc\misc\other\..\whatever.txt");
if (info1.FullName.Equals(info2.FullName)) {
    Console.WriteLine("yep, they're equal");
}
Console.WriteLine(info1.FullName);
Console.WriteLine(info2.FullName);

Output is:

yep, they're equal
C:\stuff\things\etc\misc\whatever.txt
C:\stuff\things\etc\misc\whatever.txt

3
ответ дан 4 December 2019 в 11:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: