2010-03-03 7 views
3

J'ai un répertoire qui contient jpg, tif, pdf, doc et xls. La base de données client conly contient les noms de fichiers sans extension. Mon application doit récupérer le fichier et télécharger le fichier. L'une des propriétés de l'objet de téléchargement est l'extension de fichier.Extension de fichier - C#

est-il un moyen d'obtenir l'extension de fichier si tout ce que j'ai est le chemin et le nom

par exemple:

C: \ temp \ somepicture.jpg est le fichier et les informations que j'ai par db

c: \ temp \ somepicture

+1

Que se passe si 'C: \ temp' contient à la fois' C: \ temp \ somepicture.jpg' et 'C: \ temp \ somepicture.tif'? Quel fichier doit être référencé par C: \ temp \ somepicture? – Donut

+0

Donut - On m'a assuré que les noms seraient uniques et optionnels. – cduo

Répondre

0

Vous pouvez obtenir une liste de tous les fichiers avec ce nom, quel que soit l'extension:

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

De toute évidence, si vous avez pas d'autres informations et il y a 2 fichiers avec le même nom et des extensions différentes, vous ne pouvez rien faire (par exemple, il y a somepicture.jpg et somepicture .png en même temps). D'autre part, ce ne sera généralement pas le cas, vous pouvez donc simplement utiliser un motif de recherche (par exemple somepicture. *) Pour trouver le seul et unique fichier (si vous êtes chanceux).

0

Recherchez les fichiers nommés somepicture. * Dans ce dossier et téléchargez ceux qui correspondent?

0

Récupère le dossier de plus bas niveau pour chaque chemin. Pour votre exemple, vous auriez: « c: \ temp \ »

Ensuite, trouver tous les fichiers qui commencent par votre nom de fichier dans ce dossier, dans ce cas: « somepicture »

Enfin, prenez l'extension hors du nom de fichier correspondant. Si vous avez des doublons, vous devrez gérer cela de manière unique.

3

Quelque chose comme ça peut-être:

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

Vous ne voulez pas parcourir tous les fichiers du répertoire lorsque vous connaissez une partie du fichier que vous recherchez. Utilisez un filtre de modèle lors de l'appel 'GetFiles'. –

5

Utilisez Directory.GetFiles(fileName + ".*"). Si elle renvoie un seul fichier, alors vous trouverez le fichier dont vous avez besoin. S'il renvoie plus d'un, vous devez choisir lequel télécharger.

+0

+1 C'est beaucoup mieux que ma réponse. –

+0

Si la base de données possède uniquement le nom de fichier sans extension et si GetFiles() renvoie autre chose qu'un fichier (plus d'un fichier ou aucun fichier), vous devez générer une exception. –

+1

@Partha Choudhury, que faire lorsque GetFiles() retourne plusieurs fichiers est une décision d'affaires, pas une décision technique. Il n'est pas approprié de simplement jeter une exception toujours. Cela dépend des règles métier spécifiques. –

0

Vous devez utiliser System.IO.Directory.GetFiles() et parcourir tous les noms de fichiers. Vous rencontrerez des problèmes lorsque vous avez une collision comme somefile.jpg et somefile.tif.

On dirait que vous avez des problèmes plus importants que cela et vous voudrez peut-être faire un argument pour stocker l'extension de fichier dans votre base de données ainsi pour lever l'ambiguïté.

+0

ne pas être en désaccord, mais si nous allons dans le chemin des corrections de données théoriques, à mon humble avis garder le nom de fichier (avec extension) dans la base de données (utilisez votre nouveau code pour le réparer lors de votre prochaine mise à niveau? si vous voulez que les parties soient retirées, utiliser System.IO.Path pour cela est beaucoup plus agréable que de stocker les parties séparément. –

0

que vous pourriez faire quelque chose comme ça peut-être ....

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

La partie manipulation de chaînes a besoin d'être travaillée. Exemple d'entrée: 'C: \ somefile v. 2.xls' –

+0

secondant le commentaire de Jon, mais pour obtenir les parties, utilisez les différentes méthodes statiques de System.IO.Path - beaucoup plus facile :) –

0

un plus, avec l'hypothèse de pas de fichiers avec le même nom mais une extension différente.

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

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

    Console.WriteLine(fullFilenameAndPath); 
} 
0

Depuis le chemin du fichier estropié vous pouvez obtenir le chemin du répertoire et le nom du fichier:

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

Ensuite, vous pouvez obtenir tous les fichiers qui correspondent au nom de fichier avec une extension:

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

Si le tableau contient un élément, vous avez votre correspondance. S'il y a plus d'un élément, vous devez décider lequel utiliser ou quoi faire avec.

0

Toutes les pièces sont ici dans les réponses existantes, mais en essayant juste de les unifier en une réponse pour vous - étant donné la déclaration «garanti unique» avec laquelle vous travaillez, vous pouvez lancer un FirstOrDefault puisque vous ne le faites pas Vous devez vous soucier de choisir parmi plusieurs correspondances potentielles.

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(); 
} 

Sortie:

> 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