ファイル名文字列からファイル拡張子を削除する


201

と言う文字列がある場合"abc.txt"、部分文字列を取得する簡単な方法はあり"abc"ますか?

fileName.IndexOf('.')ファイル名が"abc.123.txt"何かである可能性があるので、私はできません。明らかに、拡張子(つまり"abc.123")を取り除きたいだけです。

回答:


372

このPath.GetFileNameWithoutExtensionメソッドは、名前から明らかなように、拡張子なしで引数として渡すファイル名を提供します。


1
提案するつもりだった:string.Format( "{0} \\ {1}"、Path.GetDirectoryName(path)、Path.GetFileNameWithoutExtension(path))...しかし、Path.Combineを使用する代わりに、Path.Combine String.Format!
emery.noel 2016年

4
パスを保持することは望ましい効果ではありません。メソッド名はGetFileNameWithoutExtensionであることに注意してください。パスの保持が約束された場合、メソッド名は異なっているはずです。メソッドの説明も非常に具体的で、拡張子のないファイル名のみが返されます。OPは、パスが必要であることを指定していません。全く逆です。
Morten Bork

@dukevinこの質問については、パスとは何の関係もありません。ファイル名から拡張子の削除を要求するだけです。
Rory McCrossan、2018年

248

この目的のためにフレームワークにメソッドがあり、拡張機能を除いてフルパスを維持します。

System.IO.Path.ChangeExtension(path, null);

ファイル名だけが必要な場合は、

System.IO.Path.GetFileNameWithoutExtension(path);

37
これが正解です。受け入れられた回答はファイルパス
レモン、

8
それはパスを保持するので、これは良い答えです
ジェームズ・H

8
ここnullには魔法の価値があります。String.Empty別名を使用する""と、末尾に[ .]ドットが残ります。
THBBFT 2018年

この答えの方が良いと思います。GetFileNameWithoutExtensionより明示的です。望ましくない可能性のある副作用とそれを回避するための代替策の存在について知っておくのは良いことですが。
jeromej

57

使用できます

string extension = System.IO.Path.GetExtension(filename);

次に、拡張機能を手動で削除します。

string result = filename.Substring(0, filename.Length - extension.Length);

@Bio、実際にはそれは拡張子の長さであり、次に拡張子までファイル名を取得します。
ネヴィル

System.IO.Path機能を無視することを決定した場合、次のように拡張子を取得した方が良いとは言えません。?
QMaster、2018

27

String.LastIndexOfが機能します。

string fileName= "abc.123.txt";
int fileExtPos = fileName.LastIndexOf(".");
if (fileExtPos >= 0 )
 fileName= fileName.Substring(0, fileExtPos);

10
のような拡張子のないファイルに注意してfoo/bar.cat/cheeseください。
Cameron

String.LastIndexOfこのようなことを達成するのは危険です。拡張子のないファイルの場合、@ Cameronが上で述べたように、結果が期待どおりにならない場合があります。これを行う最も安全な方法は、上記の@Logmanの回答
シバ

13

拡張子なしでフルパスを作成したい場合は、次のようにすることができます:

Path.Combine( Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath))

しかし、私はそれを行うためのより簡単な方法を探しています。誰かが何か考えを持っていますか?


8

以下を使用し、コードを減らしました

string fileName = "C:\file.docx";
MessageBox.Show(Path.Combine(Path.GetDirectoryName(fileName),Path.GetFileNameWithoutExtension(fileName)));

出力は

C:\ file


2
そして、ディレクトリ区切り文字が '/'の場合はどうでしょう;)?
Logman、2016

4
Path.Combine()指定する代わりに使用し"\\"ます。
Broots Waymb 2016

1

文字列操作を使用する場合は、文字または部分文字列の最後の出現を検索する関数lastIndexOf()を使用できます。Javaには多数の文字列関数があります。


1

UWP apiを要求していない可能性があります。しかし、UWPでは、file.DisplayName拡張子なしの名前です。他の人に役立つことを願っています。


0

私はそれが古い質問でPath.GetFileNameWithoutExtensionあり、より良い、そしておそらくよりクリーンなオプションであることを知っています。しかし、個人的に私はこの2つの方法をプロジェクトに追加し、それらを共有したいと考えました。範囲とインデックスを使用するため、これにはC#8.0が必要です。

public static string RemoveExtension(this string file) => ReplaceExtension(file, null);

public static string ReplaceExtension(this string file, string extension)
{
    var split = file.Split('.');

    if (string.IsNullOrEmpty(extension))
        return string.Join(".", split[..^1]);

    split[^1] = extension;

    return string.Join(".", split);
}

-1
    /// <summary>
    /// Get the extension from the given filename
    /// </summary>
    /// <param name="fileName">the given filename ie:abc.123.txt</param>
    /// <returns>the extension ie:txt</returns>
    public static string GetFileExtension(this string fileName)
    {
        string ext = string.Empty;
        int fileExtPos = fileName.LastIndexOf(".", StringComparison.Ordinal);
        if (fileExtPos >= 0)
            ext = fileName.Substring(fileExtPos, fileName.Length - fileExtPos);

        return ext;
    }

2
これは質問の答えにはなりません。
Rapptz 2014年

1
なぜこれのための拡張メソッドを書くのですか?この非常に特殊なケースを除いて、String.GetFileExtension()はまったく意味がありません。ただし、関数はどこにでも持ち越され、任意の文字列に固有の動作を示すことになっています。そうではありません。

-3
        private void btnfilebrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            //dlg.ShowDialog();
            dlg.Filter = "CSV files (*.csv)|*.csv|XML files (*.xml)|*.xml";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string fileName;
                fileName = dlg.FileName;
                string filecopy;
                filecopy = dlg.FileName;
                filecopy = Path.GetFileName(filecopy);
                string strFilename;
                strFilename = filecopy;
                 strFilename = strFilename.Substring(0, strFilename.LastIndexOf('.'));
                //fileName = Path.GetFileName(fileName);             

                txtfilepath.Text = strFilename;

                string filedest = System.IO.Path.GetFullPath(".\\Excels_Read\\'"+txtfilepath.Text+"'.csv");
               // filedest = "C:\\Users\\adm\\Documents\\Visual Studio 2010\\Projects\\ConvertFile\\ConvertFile\\Excels_Read";
                FileInfo file = new FileInfo(fileName);
                file.CopyTo(filedest);
             // File.Copy(fileName, filedest,true);
                MessageBox.Show("Import Done!!!");
            }
        }

コードを投稿するだけでなく、コードと一緒に回答を説明する方がはるかに役立ちます。
SuperBiasedMan 2015年

1
コードの大部分は完全に無関係です。説明がありません。これは役に立ちません。
Palec、2016年

コードは、問題の問題とは異なる問題に固有のものです。
ドミニク・ベット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.