파일 이름 문자열에서 파일 확장자 제거


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

4
경로를 유지하는 것은 바람직한 효과가 아닙니다. 메소드 이름은 GetFileNameWithoutExtension입니다. 경로 보존이 약속 된 경우 메소드 이름이 달라야합니다. 메서드 설명도 매우 구체적이며 확장명이없는 파일 이름 만 반환됩니다. OP는 경로가 필요하다고 지정하지 않습니다. 꽤 대조적 인 것.
Morten Bork

@ dukevin이 질문에 대해서는 경로와 관련이 없습니다. 파일 이름 에서 확장명을 제거하도록 요청합니다 .
Rory McCrossan

248

이 목적을 위해 프레임 워크에는 확장을 제외하고 전체 경로를 유지하는 방법이 있습니다.

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

파일 이름 만 필요한 경우

System.IO.Path.GetFileNameWithoutExtension(path);

37
이것이 정답입니다. 허용되는 답변은 파일 경로를 제거합니다
레몬

8
이것은 경로를 유지하면서 더 나은 답변입니다
James H

8
null여기에 마법의 값을 갖는다. String.Empty일명 사용 ""하면 후행 [ .] 점이 남습니다 .
THBBFT

이 답변이 더 낫다는 데 동의합니다. GetFileNameWithoutExtension더 명시 적입니다. 잠재적으로 원하지 않는 부작용과 그것을 피할 수있는 대안의 존재에 대해 아는 것이 좋지만.
jeromej

57

당신이 사용할 수있는

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

그런 다음 확장 프로그램을 수동으로 제거하십시오.

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

@Bio, 실제로는 확장자의 길이를 얻은 다음 확장자까지 파일 이름을 가져옵니다.
Neville

System.IO.Path 기능을 무시하기로 결정한 경우 다음과 같이 확장 기능을 사용하면 더 좋지 않습니다. string extension = filename.Substring (filename.LastIndexOf ( '.')); ?
QMaster

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 's answer을
시바

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 : \ 파일


2
내 디렉토리 구분자가 '/';)이면 어떻게 되나요?
Logman

4
Path.Combine()지정하지 말고 사용하십시오 "\\".
Broots Waymb

1

문자열 연산을 사용하려면 문자 또는 하위 문자열의 마지막 항목을 검색하는 lastIndexOf () 함수를 사용할 수 있습니다. Java에는 수많은 문자열 함수가 있습니다.


1

UWP API를 요청하지 않을 수도 있습니다. 그러나 UWP에서 file.DisplayName확장자가없는 이름입니다. 다른 사람들에게 유용하기를 바랍니다.


0

나는 그것이 오래된 질문이며 Path.GetFileNameWithoutExtension더 좋고 아마도 더 깨끗한 옵션이라는 것을 알고 있습니다. 그러나 개인적 으로이 두 가지 방법을 내 프로젝트에 추가하고 공유하고 싶었습니다. 범위와 인덱스를 사용하기 때문에 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

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

1
코드의 많은 부분은 완전히 관련이 없습니다. 설명이 없습니다. 이것은 유용하지 않습니다.
Palec

코드가 문제와 다른 문제에 너무 구체적입니다.
Dominic Bett

-4

이 구현은 작동합니다.

string file = "abc.txt";
string fileNoExtension = file.Replace(".txt", "");

11
무엇에 대해 abc.txt.pdf? :-)
Palec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.