2010-03-03 3 views
3

У меня есть каталог, который содержит jpg, tif, pdf, doc и xls. Консоль клиентского БД содержит имена файлов без расширения. Мое приложение должно забрать файл и загрузить файл. Одним из свойств объекта upload является расширение файла.Расширение файла - C#

Есть ли способ получить расширение файла, если все у меня есть путь и имя

например:

C: \ Temp \ somepicture.jpg является файл и информация, которую я через БД

C: \ Temp \ somepicture

+1

Что произойдет, если 'C: \ temp' содержит как' C: \ Temp \ somepicture.jpg' и 'C: \ Temp \ somepicture.tif'? К какому файлу должен относиться «C: \ temp \ somepicture»? – Donut

+0

Donut- я был уверен, что имена будут уникальными и будут отображаться в том, что они будут ... – cduo

ответ

0

Вы можете получить список всех файлов с таким именем, независимо от расширения:

public string[] GetFileExtensions(string path) 
{ 
    System.IO.DirectoryInfo directory = 
     new System.IO.DirectoryInfo(System.IO.Path.GetDirectoryName(path)); 

    return directory.GetFiles(
     System.IO.Path.GetFileNameWithoutExtension(path) + ".*") 
     .Select(f => f.Extension).ToArray(); 
} 
0

Очевидно, что если у вас нет никакой другой информации, и есть 2 файла с одинаковыми именами и разными расширениями, вы не можете делать ничего (например, есть somepicture.jpg и somepicture .png в то же время).

С другой стороны, обычно это не так, поэтому вы можете просто использовать шаблон поиска (например, somepicture. *), Чтобы найти один и только (если вам повезет) файл.

0

Искать файлы с именем somepicture. * В этой папке и загружать все, что соответствует?

0

Получить папку нижнего уровня для каждого пути. Для примера, вы бы: «C: \ Temp \»

Затем найти все файлы, которые начинаются с имени файла в этой папке, в данном случае: «somepicture»

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

3

Что-то вроде этого, может быть:

DirectoryInfo D = new DirectoryInfo(path); 
foreach (FileInfo fi in D.GetFiles()) 
{ 
    if (Path.GetFileNameWithoutExtension(fi.FullName) == whatever) 
     // do something 
} 
+0

Вы не хотите проходить через все файлы в каталоге, когда знаете часть файла, который вы ищете. Используйте фильтр шаблонов при вызове 'GetFiles'. –

5

Использование Directory.GetFiles(fileName + ".*"). Если он возвращает только один файл, то вы найдете нужный файл. Если он возвращает более одного, вы должны выбрать, что загрузить.

+0

+1 Это намного лучше, чем мой ответ. –

+0

Если в БД есть только имя файла без расширения, и если GetFiles() возвращает что-либо, кроме одного файла (более одного файла или файла), вы должны выбросить исключение. –

+1

@ Partha Choudhury, что делать, когда GetFiles() возвращает несколько файлов - это деловое решение, а не техническое. Не рекомендуется просто заполнять исключение всегда. Зависит от конкретных бизнес-правил. –

0

Вам нужно будет использовать System.IO.Directory.GetFiles() и повторить все имена файлов. Вы столкнетесь с проблемами при столкновении, например somefile.jpg и somefile.tif.

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

+0

не согласны, но если мы идем по пути теоретических исправлений данных, IMHO просто сохраните имя файла (с расширением) в базе данных (используйте свой новый код, чтобы исправить его во время следующего обновления? :) - if вы хотите, чтобы части отступали, использование System.IO.Path для этого было намного приятнее для меня, чем для самостоятельного хранения частей :) –

0

вы могли бы сделать что-то вроде этого, возможно ....

DirectoryInfo di = new DirectoryInfo("c:/temp/"); 
    FileInfo[] rgFiles = di.GetFiles("somepicture.*"); 
    foreach (FileInfo fi in rgFiles) 
    { 
     if(fi.Name.Contains(".")) 
     { 
      string name = fi.Name.Split('.')[0].ToString(); 
      string ext = fi.Name.Split('.')[1].ToString(); 

      System.Console.WriteLine("Extension is: " + ext); 
     } 
    } 
+0

Эта часть нуждается в обработке строк. Пример ввода: 'C: \ somefile v. 2.xls' –

+0

, отсылающий комментарий Джона, но для получения деталей используйте различные статические методы с System.IO.Path - намного проще :) –

0

еще один, с предположением о отсутствии файлов с тем же именем, но с разным расширением.

string[] files = Directory.GetFiles(@"c:\temp", @"testasdadsadsas.*"); 

if (files.Length >= 1) 
{ 
    string fullFilenameAndPath = files[0]; 

    Console.WriteLine(fullFilenameAndPath); 
} 
0

От хромого пути к файлу вы можете получить путь к каталогу и имя файла:

string path = Path.GetDirectoryName(filename); 
string name = Path.GetFileName(filename); 

Тогда вы можете получить все файлы, который соответствует имени файла с любым расширением:

FileInfo[] found = new DirectoryInfo(path).GetFiles(name + ".*"); 

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

0

Все части находятся здесь в существующих ответах, но просто пытаются объединить их в один ответ для вас - учитывая «гарантированное уникальное» заявление, с которым вы работаете, вы можете бросить в FirstOrDefault, так как вы не нужно беспокоиться о выборе между несколькими потенциальными матчами.

static void Main(string[] args) 
{ 
    var match = FindMatch(args[0]); 
    Console.WriteLine("Best match for {0} is {1}", args[0], match ?? "[None found]"); 
} 

private static string FindMatch(string pathAndFilename) 
{ 
    return FindMatch(Path.GetDirectoryName(pathAndFilename), Path.GetFileNameWithoutExtension(pathAndFilename)); 
} 

private static string FindMatch(string path, string filename) 
{ 
    return Directory.GetFiles(path, filename + ".*").FirstOrDefault(); 
} 

Выход:

> ConsoleApplication10 c:\temp\bogus 
Best match for c:\temp\bogus is [None found] 
> ConsoleApplication10 c:\temp\7z465 
Best match for c:\temp\7z465 is c:\temp\7z465.msi 
> ConsoleApplication10 c:\temp\boot 
Best match for c:\temp\boot is c:\temp\boot.wim 
Смежные вопросы