文件扩展名-c#
我有一个包含jpg、tif、pdf、doc和xls的目录。客户机数据库包含不带扩展名的文件名。我的应用程序必须拿起文件并上传文件。上载对象的属性之一是文件扩展名 如果我只有路径和名称,有没有办法获得文件扩展名 例如: C:\temp\somepicture.jpg是文件,我通过db获得的信息是文件扩展名-c#,c#,C#,我有一个包含jpg、tif、pdf、doc和xls的目录。客户机数据库包含不带扩展名的文件名。我的应用程序必须拿起文件并上传文件。上载对象的属性之一是文件扩展名 如果我只有路径和名称,有没有办法获得文件扩展名 例如: C:\temp\somepicture.jpg是文件,我通过db获得的信息是 c:\temp\somepicture显然,如果您没有其他信息,并且有两个文件具有相同的名称和不同的扩展名,则您无法执行任何操作(例如,同时存在somepicture.jpg和somepicture.pn
c:\temp\somepicture显然,如果您没有其他信息,并且有两个文件具有相同的名称和不同的扩展名,则您无法执行任何操作(例如,同时存在somepicture.jpg和somepicture.png)
另一方面,通常情况并非如此,因此您可以简单地使用搜索模式(例如somepicture.*)查找唯一的(如果幸运的话)文件。在该文件夹中搜索名为somepicture.*的文件,并上载任何匹配的文件。为每个路径获取最低级别的文件夹。例如,您可以: 'c:\temp' 然后在该文件夹中查找以您的文件名开头的任何文件,在本例中: “一些照片”
最后,从匹配的文件名中抓取扩展名。如果有重复项,则必须以独特的方式处理。类似的内容可能:
DirectoryInfo D = new DirectoryInfo(path);
foreach (FileInfo fi in D.GetFiles())
{
if (Path.GetFileNameWithoutExtension(fi.FullName) == whatever)
// do something
}
使用
Directory.GetFiles(fileName+“*”)
。如果它只返回一个文件,那么您就可以找到所需的文件。如果它返回多个文件,您必须选择要上载的文件。您必须使用System.IO.Directory.GetFiles()并遍历所有文件名。当发生诸如somefile.jpg和somefile.tif之类的冲突时,您将遇到问题
听起来您有比这更大的问题,您可能希望在数据库中存储文件扩展名以消除歧义。您可以获得具有该名称的所有文件的列表,而不考虑扩展名:
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();
}
FileInfo[] found = new DirectoryInfo(path).GetFiles(name + ".*");
也许你可以这样做
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);
}
}
还有一个,假设没有同名但扩展名不同的文件
string[] files = Directory.GetFiles(@"c:\temp", @"testasdadsadsas.*");
if (files.Length >= 1)
{
string fullFilenameAndPath = files[0];
Console.WriteLine(fullFilenameAndPath);
}
从损坏的文件路径中,您可以获得目录路径和文件名:
string path = Path.GetDirectoryName(filename);
string name = Path.GetFileName(filename);
然后,您可以获取与文件名匹配的所有文件,其扩展名为:
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();
}
FileInfo[] found = new DirectoryInfo(path).GetFiles(name + ".*");
如果数组包含一个项,则您拥有匹配项。如果有多个条目,您必须决定使用哪一条,或者如何处理它们。所有条目都在现有答案中,但只是尝试将它们统一为一个答案-考虑到您正在使用的“保证唯一”声明,您可以输入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
如果
C:\temp
同时包含C:\temp\somepicture.jpg
和C:\temp\somepicture.tif
,会发生什么情况?哪个文件应该C:\temp\somepicture
引用?甜甜圈-我已经得到保证,名称将是唯一的,并认为它们将是唯一的..当您知道要查找的文件的一部分时,您不希望遍历目录中的所有文件。在调用GetFiles
时使用模式过滤器。这需要处理字符串操作部分。示例输入:C:\somefile v。2.xls
附议Jon的评论,但为了获得零件,请使用System.IO.Path中的各种静态方法-简单得多:)不要不同意,但如果我们要进行理论数据修复,IMHO只需将文件名(带扩展名)保留在数据库中(在下次升级时使用新代码进行修复?:)-如果你想把这些部件放回原处,使用System.IO.Path这样做比单独存储部件要好得多:)如果DB只有文件名,没有扩展名,如果GetFiles()返回的不是一个文件(多个文件或没有文件),你应该抛出一个异常。@Partha Choudhury,当GetFiles()时该怎么办返回多个文件是一项业务决策,而不是技术决策。总是抛出异常是不合适的。取决于具体的业务规则。我喜欢一种方法一个工作单元的理念,因此会创建一个GetFullPathName(DB.FileNameWithouExtension),它返回一个具有完整路径和扩展名的文件名。如果它无法返回一个文件名,因为它要么没有文件,要么有多个文件,那么它应该向调用方抛出异常实例中可用的相关信息(“未找到文件”或找到文件名列表),以便调用方可以确定要做什么。