2013-07-08 4 views
1

Как я могу получить имя файла из пути к файлу, файл может быть загружен из разных OSX или окон.
Что я пытаюсь достичь, и какие проблемы ниже:Проблема с получением имени файла из пути к файлу

  • Моя цель состоит в том, чтобы дезинфицировать имя файла, если он имеет какие-либо недопустимые символы. пример: OSX разрешает \ и несколько других символов, которые не разрешает файловая система Windows. alg заменяет \ на _.
  • Иногда некоторые браузеры (IE) отправляют весь путь как имя файла в мой код. Так что, если я загрузить общий файл из сети в окнах, IE отправляет имя как \\\\servername\\folder\\filenmae.txt

- Я не могу использовать FileInfo или путь, так как имена файлов, поступающие из OSX могут иметь недопустимые символы, такие как |, >, < и потому, что если имя файла в Mac OSX равно \\path\ex\file, fileinfo или путь дает мне «файл» как имя файла вместо всего имени.

- прямо сейчас, если имя файла имеет: \ в пути, я могу легко извлечь имя файла с помощью filename.Substring(filename.LastIndexOf(@"\") + 1)
- но моя проблема с общими файлами, так как общие файлы полный путь текстур в окнах можно быть именем файла в OSX.

Как я могу получить полное имя?
Любые предложения будут оценены.

+3

У вас нет способа узнать, является ли '\\ a \ b \ c.txt' полный путь из Windows или необычным именем файла из * nix. – SLaks

+0

Каковы правила, применяемые к имени файла в OSX? –

+0

google пожалуйста !, я знаю :-) – din

ответ

0

Спасибо за все ответы, особая благодарность @Dour High Arch. Выяснилось решение наконец. Использование класса fileInfo можно также выполнить с помощью Path, но еще не проверено.

try 
{ 
    FileInfo fileInformation = new FileInfo(tempFileName); 
    String directory = fileInformation.DirectoryName; 
    if (tempFileName.StartsWith(directory)) 
    { 
    filename = fileInformation.Name; 
    } 
} 
catch (Exception arugmentException) 
{ 
    if (!((arugmentException is ArgumentException) || 
    (arugmentException is NotSupportedException))) throw; 
} 
2

Я думаю, что вы хотите использовать статические методы Path:

Path.GetFileName(string); и Path.GetDirectoryName(string);

+1

не работает с OSX, например, имя файла файла в osx является тестом <>/\. Txt, выдает исключение, во-вторых, что, если имя файла - это путь, который является истинным в OSX. – din

1

Как уже отмечалось, это не сработает. Вы не можете создавать имена файлов, которые работают во всех ОС, или даже имена файлов, которые работают во всех файловых системах в одной ОС. Я столкнулся с этой проблемой, пытаясь скопировать файлы NTFS на диск ISO 9660 из Windows.

Не пытайтесь «дезинфицировать» имена файлов; правила слишком ненадежны и конфликтуют между файловыми системами. Используйте API вашей ОС для создания файлов, например System.IO.Path.GetTempFileName или System.Windows.Controls.OpenFileDialog. Если вы пытаетесь создать имена файлов программным способом, передайте имя, которое, по вашему мнению, будет работать во всех клиентских файловых системах, например «MyFile» плюс инкрементный порядковый номер или шестнадцатеричный GUID, в API и быть готовым к исключениям файловой системы, если они не будут Работа.

Если вы копируете файлы через файловые системы, рекомендуется сохранить исходное имя файла, которое будет отображаться для пользователей, и использовать его в качестве диалогов по умолчанию для сохранения файлов и т. Д., Но, опять же, не пишите программы, чтобы полагаться на них.

+0

Я понимаю, но что, если кто-то загружает файл из OS X с текстом файла <>/\. Txt, а другой человек пытается загрузить в windows. (игнорируйте, как я буду хранить его на сервере) – din

+0

Покажите человеку имя «текст <>/\. txt» в пользовательском интерфейсе. Если вы попытаетесь сохранить это в Windows, он будет кидать, и вам придется попросить пользователя повторить попытку или создать свое собственное имя. Но это может случиться с любым именем файла у пользователя; неважно, было ли имя получено из другой файловой системы. –

+0

хорошая идея, но моя задача - переименовать такие файлы. На данный момент временное решение - try {filename = path.getFileName (fileName)} catch (Exception e) {if (! (E is ArgumentException)) throw;} filename = renameFileName (имя_файла); – din

Смежные вопросы