확장자없이 파일 이름 얻기


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.txt, file2.txt, file3.txt.

확장자없이 파일 이름을 얻으려면 어떻게해야합니까? ( file1, file2, file3)

답변:


479

당신은 사용할 수 있습니다 Path.GetFileNameWithoutExtension:

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

나는 이것을 직접 얻을 수있는 방법이 없다는 것에 놀랐지 만 FileInfo(또는 적어도 그것을 볼 수는 없다).


7
그리고 확장명 (예를 들어 나중에 추가하기 위해)을 얻으려면 다음을 사용하십시오.
Justin

2
@Juzzz 기본 문자열로 작업하는 경우 편리하지만 FileInfo 객체가 이미 있으면 Path를 사용하지 않아도됩니다. FileInfo는 이미 "Extension"속성을 제공합니다.
jmbpiano

'현재 컨텍스트에'builder '가 없습니다'오류가 발생했습니다. 'system.Text'를 추가했지만 여전히 같은 오류가 발생했습니다. 이유가 무엇입니까?
ffttyy

@ffttyy builderStringBuilderOP 코드의 인스턴스입니다 . GetFileNameWithoutExtension 사용의 예일뿐입니다. 호출하는 자체 코드를 작성하는 것이 좋습니다.
Rup

9
여기서 주목할 점은 파일에 이중 확장명이 포함되어 있으면 확장 GetFileNameWithoutExtension만 제거한다는 입니다. 예를 들어, 파일 이름이 example.es6.js될 것입니다example.es6
데이비드 로버츠


22

이 솔루션은 또한 후행 쉼표를 추가하지 못하게합니다.

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

이 시나리오에서는 DirectoryInfo, FileInfo가 마음에 들지 않습니다.

DirectoryInfo 및 FileInfo는 필요한 것보다 많은 폴더와 파일에 대한 데이터를 수집하므로 필요한 것보다 많은 시간과 메모리를 소비합니다.


2
+1. 또한 선호하는 Directory.GetFiles동안 DirectoryInfo.GetFiles내가 원하는 모든 파일 이름 인 경우, 애니데이.
Yogesh

String.Join, LINQ, StringBuilder가 없기 때문에 이것을 좋아합니다.
Csaba Toth

소스 코드를 살펴보십시오. FileInfo의 생성자는 매우 가볍습니다. 그리고 당신이 보는 모든 정보는 속성을 통해 이루어집니다. 전화 할 때만 수집됩니다
fjch1997

@ fjch1997-생성자가 Path.GetFileName을 호출하고 권한을 확인합니다. 그래서 그것은 약간 중복되는 것처럼 보입니다.
Erno

@ErnodeWeerd FileIOPermission은 ACL에 대한 권한을 확인하지 않습니다. 대신 부분적으로 신뢰할 수있는 코드에 대한 권한을 확인하는 것이 일종의 .NET 메커니즘입니다. 따라서 실제 IO 호출을해서는 안됩니다. 성능에 어느 정도 영향을 미칩니 까? 나는 테스트없이 말할 수 없다. 하지만 난 그렇지 않은 가정 위대한 그
fjch1997

10

사용하십시오 Path.GetFileNameWithoutExtension. 경로는 System.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)));

이 방법은 사용하지 StringBuilder않지만 String.Join(). 또한 다른 답변 중 하나에서 보지 않았으므로 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
이미 이것을 수행하는 Framework 클래스가 있다는 것을 인식하지 못하는 것 같습니다.
Andrew Barber

3
또한 누군가 파일 이름을 "Current.XLSFiles.xls"로 지정하면 REAL 문제가 발생합니다.
Tom Padilla

@TomPadilla 왜 이것이 문제를 일으킬까요?
Luke101

이 방법은 "Current.files"를 파일 이름으로 표시하기 때문입니다. ".xls"의 모든 인스턴스는 이름 중간에있는 인스턴스를 포함하여 ""로 대체되기 때문입니다.
Tom Padilla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.