拡張子なしのファイル名を取得する


279

特定のフォルダのファイル名を取得する場合:

DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in smFiles)
{
    builder.Append(fi.Name);
    builder.Append(", ");
    ...
}

fi.Name私にその拡張子を持つファイル名を与えます:file1.txtfile2.txtfile3.txt

拡張子なしのファイル名を取得するにはどうすればよいですか?(file1file2file3

回答:


479

使用できますPath.GetFileNameWithoutExtension

foreach (FileInfo fi in smFiles)
{
    builder.Append(Path.GetFileNameWithoutExtension(fi.Name));
    builder.Append(", ");
}

驚いたのですが、これを直接取得する方法がないFileInfo(または少なくとも表示されない)場合があります。


7
そして、拡張機能を取得するには(後で追加する場合など)、Path.GetExtension(fileName);を使用します。
ジャスティン

2
@Juzzzこれは、裸の文字列で作業している場合に便利ですが、FileInfoオブジェクトがすでにある場合は、Pathを気にする必要はありません。FileInfoは、この目的のために「Extension」プロパティをすでに提供しています。
jmbpiano

「「ビルダー」が現在のコンテキストに存在しません」というエラーが表示されました。'system.Text'を追加しましたが、同じエラーが発生します。理由は何ですか?
ffttyy 2016年

@ffttyy builderStringBuilderOPのコードのインスタンスになります。これは、GetFileNameWithoutExtensionの使用例にすぎません。それを呼び出す独自のコードを書く方がよいでしょう。
Rup

9
ここで注意すべき1つの問題は、ファイルに二重拡張子が含まれている場合GetFileNameWithoutExtension最後の拡張子のみが削除されることです。たとえば、ファイル名example.es6.jsは次のようになりますexample.es6
David Roberts

48

を使用しPath.GetFileNameWithoutExtension()ます。


Path.GetFileNameWithoutExtensionは、無効なパス文字をチェックし、DirectorySeparatorChar、AltDirectorySeparatorChar、またはVolumeSeparatorChar をファイル名に必要ではないように見えるループで抽出しようとするため、最善の方法ではないことに注意してください(フルパスではありません)。
S.Serpooshan

22

このソリューションでは、末尾にコンマを追加することもできません。

var filenames = String.Join(
                    ", ",
                    Directory.GetFiles(@"c:\", "*.txt")
                       .Select(filename => 
                           Path.GetFileNameWithoutExtension(filename)));

このシナリオでは、DirectoryInfo、FileInfoが嫌いです。

DirectoryInfoとFileInfoは、フォルダーとファイルに関するデータを必要以上に収集するため、必要以上の時間とメモリを消費します。


2
+1。また、ファイル名だけが欲しい場合はDirectory.GetFilesDirectoryInfo.GetFilesいつでも好きです。
Yogesh

String.Join、LINQ、StringBuilderがないため、これが好きです。
Csaba Toth 2015年

ソースコードを見てみると。FileInfoのコンストラクターは非常に軽量です。そして、あなたが見るすべての情報はプロパティを通して行われます。それらはあなたがそれらを呼び出すときにのみ収集されます
fjch1997 '19

@ fjch1997-コンストラクターはPath.GetFileNameを呼び出し、権限をチェックします。したがって、これは少し冗長なようです。
Erno、

@ErnodeWeerd FileIOPermissionは、ACLに対する権限をチェックしません。代わりに、部分的に信頼されたコードの権限をチェックするのは.NETのある種のメカニズムです。したがって、実際のIO呼び出しは行わないでください。パフォーマンスにどの程度影響しますか?テストせずに言うことはできません。しかし、私はそれはそれほど素晴らしいものではないと
思います



6

追加の回答として(または既存の回答を組み合わせるために)、DirectoryInfoクラス内でこれを実行する拡張メソッドを作成できます。これは私がかなり素早く書いたサンプルで、ディレクトリ名やその他の変更基準などを提供するために装飾することができます。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace DocumentDistributor.Library
{
    public static class myExtensions
    {
        public static string[] GetFileNamesWithoutFileExtensions(this DirectoryInfo di)
        {
            FileInfo[] fi = di.GetFiles();
            List<string> returnValue = new List<string>();

            for (int i = 0; i < fi.Length; i++)
            {
                returnValue.Add(Path.GetFileNameWithoutExtension(fi[i].FullName)); 
            }

            return returnValue.ToArray<string>();
         }
    }
}

編集:また、配列の構築を達成するためにLINQを使用した場合、このメソッドはおそらく簡略化または驚くほど改良できると思いますが、LINQでこの種のサンプルを十分に迅速に実行する経験はありません。

編集2(ほぼ4年後):これは私が使用するLINQ化された方法です。

public static class myExtensions
{
    public static IEnumerable<string> GetFileNamesWithoutExtensions(this DirectoryInfo di)
    {
        return di.GetFiles()
            .Select(x => Path.GetFileNameWithoutExtension(x.FullName));
    }
}

5

FileInfo 独自の拡張子を知っているので、それを削除することができます

fileInfo.Name.Replace(fileInfo.Extension, "");
fileInfo.FullName.Replace(fileInfo.Extension, "");

または、それが真ん中に現れるかもしれないと妄想的であるか、またはマイクロ最適化したい場合:

file.Name.Substring(0, file.Name.Length - file.Extension.Length)

4

ファイル名にディレクトリが含まれていて、ディレクトリを失う必要がない場合:

fileName.Remove(fileName.LastIndexOf("."))

2

これを試して、

string FileNameAndExtension =  "bılah bılah.pdf";
string FileName = FileNameAndExtension.Split('.')[0];

1

参考までに:

DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
string fileNames = String.Join(", ", smFiles.Select<FileInfo, string>(fi => Path.GetFileNameWithoutExtension(fi.FullName)));

この方法では使用しませんStringBuilderString.Join()。また、他の回答の1つで見たようにではなく、Path.GetFileNameWithoutExtension()フルパス(fi.FullName)が必要であることに注意してくださいfi.Name


-5
using System;

using System.IO;

public class GetwithoutExtension
{

    public static void Main()
    {
        //D:Dir dhould exists in ur system
        DirectoryInfo dir1 = new DirectoryInfo(@"D:Dir");
        FileInfo [] files = dir1.GetFiles("*xls", SearchOption.AllDirectories);
        foreach (FileInfo f in files)
        {
            string filename = f.Name.ToString();
            filename= filename.Replace(".xls", "");
            Console.WriteLine(filename);
        }
        Console.ReadKey();

    }

}

5
これを行うフレームワーククラスがすでにあることに気づいていないようです。
アンドリューバーバー

3
また、誰かがファイルに「Current.XLSFiles.xls」という名前を付けた場合、これは実際の問題の原因になります。
Tom Padilla

@TomPadillaなぜこれが問題を引き起こすのでしょうか?
Luke101

このメソッドは「Current.files」をファイル名として表示するためです。名前の中央にあるものも含め、「。xls」のすべてのインスタンスが「」に置き換えられるためです。
Tom Padilla、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.