Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件扩展名-c#_C# - Fatal编程技术网

文件扩展名-c#

文件扩展名-c#,c#,C#,我有一个包含jpg、tif、pdf、doc和xls的目录。客户机数据库包含不带扩展名的文件名。我的应用程序必须拿起文件并上传文件。上载对象的属性之一是文件扩展名 如果我只有路径和名称,有没有办法获得文件扩展名 例如: C:\temp\somepicture.jpg是文件,我通过db获得的信息是 c:\temp\somepicture显然,如果您没有其他信息,并且有两个文件具有相同的名称和不同的扩展名,则您无法执行任何操作(例如,同时存在somepicture.jpg和somepicture.pn

我有一个包含jpg、tif、pdf、doc和xls的目录。客户机数据库包含不带扩展名的文件名。我的应用程序必须拿起文件并上传文件。上载对象的属性之一是文件扩展名

如果我只有路径和名称,有没有办法获得文件扩展名

例如:

C:\temp\somepicture.jpg是文件,我通过db获得的信息是


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),它返回一个具有完整路径和扩展名的文件名。如果它无法返回一个文件名,因为它要么没有文件,要么有多个文件,那么它应该向调用方抛出异常实例中可用的相关信息(“未找到文件”或找到文件名列表),以便调用方可以确定要做什么。