एक्सटेंशन के बिना फ़ाइल नाम प्राप्त करना


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
और एक्सटेंशन प्राप्त करने के लिए (उदाहरण के लिए बाद में जोड़ने के लिए) का उपयोग करें: Path.GetExtension (fileName);
जस्टिन

2
यदि आप एक नंगे तार के साथ काम कर रहे हैं, तो @ जज़्ज़ आसान है, लेकिन अगर आपके पास पहले से ही एक फ़ाइलइंफो ऑब्जेक्ट है, तो पथ से परेशान होने की कोई आवश्यकता नहीं है। FileInfo पहले से ही उद्देश्य के लिए "एक्सटेंशन" संपत्ति प्रदान करता है।
जुम्बियानो पियानो

मुझे त्रुटि मिली "" बिल्डर 'वर्तमान संदर्भ में मौजूद नहीं है "। मैंने 'system.Text' जोड़ा, लेकिन फिर भी वही त्रुटि हुई। क्या कारण है?
19

ओपी के कोड में @ffttyy builderएक उदाहरण होगा StringBuilder। यह सिर्फ GetFileNameWithoutExtension का एक उदाहरण उपयोग है - आप संभवतः इसे कॉल करने वाले अपने कोड को लिखने में बेहतर करेंगे।
रूप

9
यहां ध्यान देने वाली बात यह है कि अगर आपकी फ़ाइल में डबल एक्सटेंशन है, तो GetFileNameWithoutExtensionकेवल अंतिम एक्सटेंशन निकालता है । उदाहरण के लिए, फ़ाइल नाम example.es6.jsबन जाएगाexample.es6
डेविड रॉबर्ट्स

48

का उपयोग करें Path.GetFileNameWithoutExtension()


ध्यान दें कि Path.GetFileNameWithoutExtension सबसे अच्छा तरीका नहीं है क्योंकि यह अमान्य पथ वर्णों के लिए जाँच करता है और किसी निर्देशिका में DirectorySeparatorChar, AltDirectorySeparatorChar या VolumeSeparatorChar को निकालने की कोशिश करता है जो फ़ाइल नामों के लिए आवश्यक नहीं है (पूर्ण पथ का नहीं)!
एस.पोरोशन

22

यह समाधान एक अनुगामी अल्पविराम को जोड़ने से भी रोकता है।

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

मैं इस परिदृश्य के लिए DirectoryInfo, FileInfo को नापसंद करता हूं।

DirectoryInfo और FileInfo फ़ोल्डर और फ़ाइलों के बारे में अधिक डेटा एकत्र करते हैं, जिससे उन्हें जरूरत से ज्यादा समय और मेमोरी लगती है।


2
+1। मैं भी पसंद करते हैं Directory.GetFilesअधिक DirectoryInfo.GetFiles, anyday अगर सब मैं चाहता हूँ फ़ाइल नाम है।
योगेश

मुझे यह पसंद है क्योंकि String.Join, LINQ, कोई StringBuilder।
सेसाबा टोथ

यदि आप स्रोत कोड पर एक नज़र डालें। FileInfo के निर्माता का वजन बहुत हल्का है। और आपके द्वारा देखी गई सभी जानकारी गुणों के माध्यम से की जाती है। वे केवल तब एकत्रित होते हैं जब आप उन्हें कॉल करते हैं
fjch1997

@ fjch1997 - निर्माता Path.GetFileName को कॉल करता है और अनुमतियों की जांच करता है। ताकि थोड़ा बेमानी लगे।
एरनो

@ErnodeWeerd FileIOPermission ACL के विरुद्ध अनुमति की जाँच नहीं करता है। इसके बजाय यह आंशिक रूप से विश्वसनीय कोड के लिए अनुमति की जांच करने के लिए .NET में किसी प्रकार का तंत्र है। तो, यह किसी भी वास्तविक आईओ कॉल नहीं करना चाहिए। यह प्रदर्शन पर कितना प्रभाव डालता है? मैं परीक्षण के बिना नहीं कह सकता लेकिन मुझे लगता है कि यह महान नहीं है
fjch1997

10

का उपयोग करें Path.GetFileNameWithoutExtension। पथ System.IO नेमस्पेस में है।


10
Path.GetFileNameWithoutExtension(file);

यह एक्सटेंशन प्रकार के बिना ही फ़ाइल का नाम देता है। आप इसे बदल भी सकते हैं ताकि आपको नाम और फ़ाइल दोनों प्रकार मिलें

 Path.GetFileName(FileName);

स्रोत: https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx


धन्यवाद, सबसे अच्छा जवाब हमेशा सबसे छोटा जवाब होता है।
अशरफ अबुसादा

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>();
         }
    }
}

संपादित करें: मुझे भी लगता है कि यह विधि शायद सरल या भयानक-ified हो सकती है यदि यह सरणी के निर्माण को प्राप्त करने के लिए LINQ का उपयोग करता है, लेकिन मुझे LINQ में इस तरह के नमूने के लिए जल्दी से पर्याप्त करने का अनुभव नहीं है।

2 संपादित करें (लगभग 4 साल बाद): यहाँ LINQ-ified विधि है जिसका मैं उपयोग करूंगा:

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("."))


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
आपको पता नहीं लगता है कि पहले से ही एक फ्रेमवर्क वर्ग है जो आपके लिए ऐसा करता है।
एंड्रयू बार्बर

3
इसके अलावा, अगर किसी ने अपनी फ़ाइलों को "Current.XLSFiles.xls" नाम दिया है, तो यह वास्तविक समस्याओं का कारण बनने वाला है।
टॉम पाडिला

@TomPadilla क्यों यह समस्याओं का कारण होगा?
ल्यूक १०

क्योंकि यह विधि "Current.files" को फ़ाइल नाम के रूप में प्रस्तुत करेगी। क्योंकि ".xls" के प्रत्येक उदाहरण को "" के साथ बदल दिया जाएगा, जिसमें नाम के मध्य वाले भी शामिल हैं।
टॉम पाडिला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.