확장자없이 파일 이름 얻기 가져올 때 : DirectoryInfo di

특정 폴더에서 파일 이름을 가져올 때 :

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)



답변

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

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

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


답변

사용하십시오 Path.GetFileNameWithoutExtension().


답변

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

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

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

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


답변

사용하십시오 Path.GetFileNameWithoutExtension. 경로는 System.IO 네임 스페이스에 있습니다.


답변

Path.GetFileNameWithoutExtension(file);

확장명없이 파일 이름 만 반환합니다. 이름과 파일 형식을 모두 얻을 수 있도록 변경할 수도 있습니다.

 Path.GetFileName(FileName);

출처 : https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx


답변

추가 답변으로 (또는 기존 답변을 합성하기 위해) 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));
    }
}


답변

FileInfo 자체 확장명을 알고 있으므로 제거 할 수 있습니다.

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

또는 중간에 나타날 수있는 편집증이거나 미세 최적화를 원할 경우 :

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