Làm cách nào để chỉ lấy tên tệp trong thư mục bằng c #?


80

Khi tôi sử dụng dòng mã như bên dưới, tôi nhận được một mảng chuỗi chứa toàn bộ đường dẫn của các tệp riêng lẻ.

private string[] pdfFiles = Directory.GetFiles("C:\\Documents", "*.pdf");

Tôi muốn biết nếu có cách nào để chỉ truy xuất tên tệp trong chuỗi thay vì toàn bộ đường dẫn.

Câu trả lời:


160

Bạn có thể sử dụng Path.GetFileNameđể lấy tên tệp từ đường dẫn đầy đủ

private string[] pdfFiles = Directory.GetFiles("C:\\Documents", "*.pdf")
                                     .Select(Path.GetFileName)
                                     .ToArray();

CHỈNH SỬA: giải pháp trên sử dụng LINQ , vì vậy nó yêu cầu tối thiểu .NET 3.5. Đây là một giải pháp hoạt động trên các phiên bản trước đó:

private string[] pdfFiles = GetFileNames("C:\\Documents", "*.pdf");

private static string[] GetFileNames(string path, string filter)
{
    string[] files = Directory.GetFiles(path, filter);
    for(int i = 0; i < files.Length; i++)
        files[i] = Path.GetFileName(files[i]);
    return files;
}

Xin chào Thomas, tôi gặp lỗi như thế này 'System.Array' không chứa định nghĩa cho 'Chọn' và không có phương thức mở rộng nào 'Chọn' chấp nhận đối số đầu tiên của loại 'System.Array' (bạn có thiếu một cách sử dụng không Chỉ thị hoặc tham chiếu hợp ngữ?) Có điều gì khác mà tôi cần xem xét không?
— HelloWorld_Always

Thêm using System.Linq;vào đầu tệp và một tham chiếu đến System.Corehội nếu nó chưa có ở đó. Nó đòi hỏi .NET 3.5 hoặc cao hơn, tôi sẽ đăng một giải pháp cho .NET 2.0 nếu bạn cần nó
— Thomas Levesque

9

Bạn có thể sử dụng phương thức Path.GetFileName(yourFileName); (MSDN) để chỉ lấy tên của tệp.


Câu hỏi là về một tập hợp các mục, không phải xử lý giá trị chuỗi đơn.
— Tigran

7

Bạn có thể sử dụng các lớp DirectoryInfo và FileInfo.

//GetFiles on DirectoryInfo returns a FileInfo object.
var pdfFiles = new DirectoryInfo("C:\\Documents").GetFiles("*.pdf");

//FileInfo has a Name property that only contains the filename part.
var firstPdfFilename = pdfFiles[0].Name;

2
string[] fileEntries = Directory.GetFiles(directoryPath);

foreach (var file_name in fileEntries){
    string fileName = file_name.Substring(directoryPath.Length + 1);
    Console.WriteLine(fileName);
}

3
Bạn có thể giải thích câu trả lời của mình không? Bạn có thể giải thích giải pháp của bạn về cơ bản khác biệt với câu trả lời 8 năm của Thomas Levesque như thế nào không? Và, đặc biệt, bạn có thể giải thích lý do tại sao bạn sử dụng Substringthay vì sử dụng Pathchức năng sẽ hoạt động tương tự, theo cách có khả năng mạnh mẽ hơn không?
— Wyck

1

Có rất nhiều cách :)

Cách thứ nhất:

string[] folders = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly);
string jsonString = JsonConvert.SerializeObject(folders);

Cách thứ 2:

string[] folders = new DirectoryInfo(yourPath).GetDirectories().Select(d => d.Name).ToArray();

Cách thứ 3:

string[] folders = 
    new DirectoryInfo(yourPath).GetDirectories().Select(delegate(DirectoryInfo di)
    {
        return di.Name;
    }).ToArray();

0
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GetNameOfFiles
{
    public class Program
    {
        static void Main(string[] args)
        {
           string[] fileArray = Directory.GetFiles(@"YOUR PATH");
           for (int i = 0; i < fileArray.Length; i++)
           {

               Console.WriteLine(fileArray[i]);
           }
            Console.ReadLine();
        }
    }
}

0

Bạn chỉ có thể sử dụng linq

Directory.EnumerateFiles(LoanFolder).Select(file => Path.GetFileName(file));

Lưu ý: EnumeratesFiles hiệu quả hơn so với Directory.GetFiles vì ​​bạn có thể bắt đầu liệt kê bộ sưu tập tên trước khi toàn bộ bộ sưu tập được trả lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.