একটি ফাইল সিস্টেমের পাথ দেওয়া হয়েছে, এর এক্সটেনশান ছাড়াই ফাইল নাম তোলার জন্য আরও ছোট উপায় আছে?


260

আমি ডাব্লুপিএফ সি # তে প্রোগ্রাম করি। আমি উদাহরণস্বরূপ নিম্নলিখিত পাথ আছে:

C:\Program Files\hello.txt

এবং আমি এটি থেকে নিষ্কাশন করতে চান hello

পথটি stringএকটি ডাটাবেস থেকে পুনরুদ্ধার করা। বর্তমানে আমি পাথটি বিভক্ত করার জন্য নিম্নলিখিত কোডটি ব্যবহার করছি '\'এবং তারপরে আবার বিভক্ত '.':

string path = "C:\\Program Files\\hello.txt";
string[] pathArr = path.Split('\\');
string[] fileArr = pathArr.Last().Split('.');
string fileName = fileArr.Last().ToString();

এটি কার্যকর, তবে আমি বিশ্বাস করি যে এর পক্ষে আরও ছোট এবং স্মার্ট সমাধান হওয়া উচিত। কোন ধারণা?


আমার সিস্টেমে Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")একই স্ট্রিংটি ফিরিয়ে দেওয়া হচ্ছে এবং কোনও কারণে এটিকে "file.cs" এ রূপান্তর করা হচ্ছে না। আমি যদি আমার কোডটি কোনও অনলাইন সংকলক ( রেক্সটেসটার ডট কমের মত ) অনুলিপি / পেস্ট করি তবে এটি কাজ করে ...?
jbyrd

উত্তর:




29

চেষ্টা

System.IO.Path.GetFileNameWithoutExtension(path); 

ডেমো

string fileName = @"C:\mydir\myfile.ext";
string path = @"C:\mydir\";
string result;

result = Path.GetFileNameWithoutExtension(fileName);
Console.WriteLine("GetFileNameWithoutExtension('{0}') returns '{1}'", 
    fileName, result);

result = Path.GetFileName(path);
Console.WriteLine("GetFileName('{0}') returns '{1}'", 
    path, result);

// This code produces output similar to the following:
//
// GetFileNameWithoutExtension('C:\mydir\myfile.ext') returns 'myfile'
// GetFileName('C:\mydir\') returns ''

https://msdn.microsoft.com/en-gb/library/system.io.path.getfilenamewithoutextension%28v=vs.80%29.aspx


দেখে মনে হচ্ছে পাথ.গেটফাইনেম উইথআউট এক্সটেনশন () কোনও ফাইল এক্সটেনশন> 3 টি অক্ষরের সাথে কাজ করছে না।
নোল্মা ইনফর্মেশনিক



11

এটা চেষ্টা কর:

string fileName = Path.GetFileNameWithoutExtension(@"C:\Program Files\hello.txt");

এটি ফাইলনামের জন্য "হ্যালো" ফিরিয়ে দেবে।


9
string Location = "C:\\Program Files\\hello.txt";

string FileName = Location.Substring(Location.LastIndexOf('\\') +
    1);

1
+1 যেহেতু এটি ব্যাকআপ হিসাবে কাজ করে সেখানে ফাইলের নামটিতে অবৈধ অক্ষর [<,> ইত্যাদি পথের মধ্যে রয়েছে in
ভুভিন

ইউনিক্স এফটিপি সার্ভারে পাথের সাথে কাজ করার সময় এটি আসলে বেশ কার্যকর।
s952163

6

এটা চেষ্টা কর,

string FilePath=@"C:\mydir\myfile.ext";
string Result=Path.GetFileName(FilePath);//With Extension
string Result=Path.GetFileNameWithoutExtension(FilePath);//Without Extension

2
আপনি সর্বোচ্চ ভোট প্রাপ্ত উত্তরে উল্লিখিত ঠিক একই পদ্ধতি ব্যবহার করেছেন।
কোডকাস্টার

1
string filepath = "C:\\Program Files\\example.txt";
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(filepath);
FileInfo fi = new FileInfo(filepath);
Console.WriteLine(fi.Name);

//input to the "fi" is a full path to the file from "filepath"
//This code will return the fileName from the given path

//output
//example.txt

আমি আশ্চর্য হয়েছি যে FileVersionInfoকোনও সংস্করণের তথ্য নেই এমন ফাইলগুলিতে ব্যবহার করা যেতে পারে। নোটটি GetVersionInfo()কেবলমাত্র সেই পথে ব্যবহার করা যেতে পারে যা ইতিমধ্যে বিদ্যমান একটি ফাইলকে রেফারেন্স করে। উভয় শ্রেণীর ফাইলের নাম পেতে ব্যবহার করা যেতে পারে, প্রশ্নটি এছাড়াও এক্সটেনশনটি সরিয়ে দিতে বলেছিল।
বাকন

1

প্রথমত, প্রশ্নের কোড বর্ণিত আউটপুট উত্পাদন করে না। এটি ফাইলের এক্সটেনশন ( "txt") এবং ফাইলের বেস নাম ( "hello") নয় racts এটি করার জন্য শেষ লাইনে কল করা উচিত , এর মতো First()নয় Last()...

static string GetFileBaseNameUsingSplit(string path)
{
    string[] pathArr = path.Split('\\');
    string[] fileArr = pathArr.Last().Split('.');
    string fileBaseName = fileArr.First().ToString();

    return fileBaseName;
}

এই পরিবর্তনটি সম্পাদন করে, এই কোডটির উন্নতি করার জন্য একটি বিষয় চিন্তা করতে হবে এটি হ'ল এটি যে পরিমাণ আবর্জনা তৈরি করে:

  • একজন string[]এক ধারণকারী stringপ্রতিটি পাথ অংশে অন্তর্ভুক্ত করার জন্যpath
  • একজন string[]অন্তত একটি ধারণকারী stringপ্রতিটি .গত পাথ সেগমেন্টের মধ্যেpath

অতএব, নমুনা পথ থেকে বেস ফাইলের নাম আহরণের "C:\Program Files\hello.txt"উত্পাদন করা উচিত (অস্থায়ী) objectগুলি "C:", "Program Files", "hello.txt", "hello", "txt", একটি string[3], এবং একটি string[2]। পদ্ধতিটি যদি বিপুল সংখ্যক পথে ডাকা হয় তবে এটি তাৎপর্যপূর্ণ হতে পারে। এটি উন্নত করতে, আমরা pathবেস নামের শুরু এবং শেষ পয়েন্টগুলি সনাক্ত করতে এবং সেগুলি একটি নতুন তৈরি করতে ব্যবহার করতে পারিstring ...

static string GetFileBaseNameUsingSubstringUnsafe(string path)
{
    // Fails on paths with no file extension - DO NOT USE!!
    int startIndex = path.LastIndexOf('\\') + 1;
    int endIndex = path.IndexOf('.', startIndex);
    string fileBaseName = path.Substring(startIndex, endIndex - startIndex);

    return fileBaseName;
}

এটি \বেসের নামের শুরু হিসাবে শেষের পরে অক্ষরের সূচকটি ব্যবহার করছে এবং সেখান থেকে প্রথমটির সন্ধান করছে. বেস নামের শেষে অক্ষরটির সূচক হিসাবে ব্যবহার করার । এটি কি মূল কোডের চেয়ে ছোট? বেশ না। এটি কি "স্মার্ট" সমাধান? আমি তাই মনে করি. কমপক্ষে, এটি যদি না হয় তবে ...

আপনি মন্তব্য থেকে দেখতে পারেন, আগের পদ্ধতিটি সমস্যাযুক্ত। যদিও এটি কাজ করে যদি আপনি ধরে নিয়ে থাকেন যে সমস্ত পাথ কোনও এক্সটেনশন সহ কোনও ফাইলের নামের সাথে শেষ হয়েছে তবে পথটি \(অর্থাত্ একটি ডিরেক্টরি পাথ) দিয়ে শেষ হয় বা অন্যথায় শেষ বিভাগে কোনও এক্সটেনশন না থাকলে এটি ব্যতিক্রম করবে throw এটি ঠিক করার জন্য, কখন endIndexকখন -1(অর্থাত্ .পাওয়া যায় না) তার জন্য অ্যাকাউন্টে আমাদের একটি অতিরিক্ত চেক যুক্ত করা দরকার ...

static string GetFileBaseNameUsingSubstringSafe(string path)
{
    int startIndex = path.LastIndexOf('\\') + 1;
    int endIndex = path.IndexOf('.', startIndex);
    int length = (endIndex >= 0 ? endIndex : path.Length) - startIndex;
    string fileBaseName = path.Substring(startIndex, length);

    return fileBaseName;
}

এখন এই সংস্করণটি আসলটির চেয়ে কম সংখ্যক নয়, তবে এটি আরও কার্যকর এবং (এখন) সঠিকও correct

যতক্ষণ না নেট পদ্ধতিগুলি এই কার্যকারিতা বাস্তবায়ন করে, অন্য অনেক উত্তর ব্যবহারের পরামর্শ দেয় Path.GetFileNameWithoutExtension()যা একটি সুস্পষ্ট, সহজ সমাধান তবে প্রশ্নের কোড হিসাবে একই ফলাফল দেয় না । একটা সূক্ষ্ম কিন্তু গুরুত্বপূর্ণ পার্থক্য মধ্যে GetFileBaseNameUsingSplit()এবং Path.GetFileNameWithoutExtension()( GetFileBaseNameUsingPath()আগে সাবেক নির্যাস সবকিছু: নীচে) প্রথম . আগেই আধুনিক নির্যাস সবকিছু শেষ . । এটি pathপ্রশ্নের নমুনার জন্য কোনও পার্থক্য তৈরি করে না , তবে উপরের চারটি পদ্ধতির ফলাফলের সাথে তুলনা করার জন্য এই টেবিলটি একবার দেখুন যখন বিভিন্ন পাথের সাথে ডাকা হয় ...

| Description           | Method                                | Path                             | Result                                                           |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| Single extension      | GetFileBaseNameUsingSplit()           | "C:\Program Files\hello.txt"     | "hello"                                                          |
| Single extension      | GetFileBaseNameUsingPath()            | "C:\Program Files\hello.txt"     | "hello"                                                          |
| Single extension      | GetFileBaseNameUsingSubstringUnsafe() | "C:\Program Files\hello.txt"     | "hello"                                                          |
| Single extension      | GetFileBaseNameUsingSubstringSafe()   | "C:\Program Files\hello.txt"     | "hello"                                                          |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| Double extension      | GetFileBaseNameUsingSplit()           | "C:\Program Files\hello.txt.ext" | "hello"                                                          |
| Double extension      | GetFileBaseNameUsingPath()            | "C:\Program Files\hello.txt.ext" | "hello.txt"                                                      |
| Double extension      | GetFileBaseNameUsingSubstringUnsafe() | "C:\Program Files\hello.txt.ext" | "hello"                                                          |
| Double extension      | GetFileBaseNameUsingSubstringSafe()   | "C:\Program Files\hello.txt.ext" | "hello"                                                          |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| No extension          | GetFileBaseNameUsingSplit()           | "C:\Program Files\hello"         | "hello"                                                          |
| No extension          | GetFileBaseNameUsingPath()            | "C:\Program Files\hello"         | "hello"                                                          |
| No extension          | GetFileBaseNameUsingSubstringUnsafe() | "C:\Program Files\hello"         | EXCEPTION: Length cannot be less than zero. (Parameter 'length') |
| No extension          | GetFileBaseNameUsingSubstringSafe()   | "C:\Program Files\hello"         | "hello"                                                          |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| Leading period        | GetFileBaseNameUsingSplit()           | "C:\Program Files\.hello.txt"    | ""                                                               |
| Leading period        | GetFileBaseNameUsingPath()            | "C:\Program Files\.hello.txt"    | ".hello"                                                         |
| Leading period        | GetFileBaseNameUsingSubstringUnsafe() | "C:\Program Files\.hello.txt"    | ""                                                               |
| Leading period        | GetFileBaseNameUsingSubstringSafe()   | "C:\Program Files\.hello.txt"    | ""                                                               |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| Trailing period       | GetFileBaseNameUsingSplit()           | "C:\Program Files\hello.txt."    | "hello"                                                          |
| Trailing period       | GetFileBaseNameUsingPath()            | "C:\Program Files\hello.txt."    | "hello.txt"                                                      |
| Trailing period       | GetFileBaseNameUsingSubstringUnsafe() | "C:\Program Files\hello.txt."    | "hello"                                                          |
| Trailing period       | GetFileBaseNameUsingSubstringSafe()   | "C:\Program Files\hello.txt."    | "hello"                                                          |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| Directory path        | GetFileBaseNameUsingSplit()           | "C:\Program Files\"              | ""                                                               |
| Directory path        | GetFileBaseNameUsingPath()            | "C:\Program Files\"              | ""                                                               |
| Directory path        | GetFileBaseNameUsingSubstringUnsafe() | "C:\Program Files\"              | EXCEPTION: Length cannot be less than zero. (Parameter 'length') |
| Directory path        | GetFileBaseNameUsingSubstringSafe()   | "C:\Program Files\"              | ""                                                               |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| Current file path     | GetFileBaseNameUsingSplit()           | "hello.txt"                      | "hello"                                                          |
| Current file path     | GetFileBaseNameUsingPath()            | "hello.txt"                      | "hello"                                                          |
| Current file path     | GetFileBaseNameUsingSubstringUnsafe() | "hello.txt"                      | "hello"                                                          |
| Current file path     | GetFileBaseNameUsingSubstringSafe()   | "hello.txt"                      | "hello"                                                          |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| Parent file path      | GetFileBaseNameUsingSplit()           | "..\hello.txt"                   | "hello"                                                          |
| Parent file path      | GetFileBaseNameUsingPath()            | "..\hello.txt"                   | "hello"                                                          |
| Parent file path      | GetFileBaseNameUsingSubstringUnsafe() | "..\hello.txt"                   | "hello"                                                          |
| Parent file path      | GetFileBaseNameUsingSubstringSafe()   | "..\hello.txt"                   | "hello"                                                          |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|
| Parent directory path | GetFileBaseNameUsingSplit()           | ".."                             | ""                                                               |
| Parent directory path | GetFileBaseNameUsingPath()            | ".."                             | "."                                                              |
| Parent directory path | GetFileBaseNameUsingSubstringUnsafe() | ".."                             | ""                                                               |
| Parent directory path | GetFileBaseNameUsingSubstringSafe()   | ".."                             | ""                                                               |
|-----------------------|---------------------------------------|----------------------------------|------------------------------------------------------------------|

... এবং আপনি দেখতে পাবেন যে Path.GetFileNameWithoutExtension()ফাইলের নামটি দ্বিগুণ প্রসারিত বা একটি নেতৃস্থানীয় এবং / বা পিছনে চলে যাওয়ার পথে পাস করার পরে বিভিন্ন ফলাফল পাওয়া যায় .। আপনি নিম্নলিখিত কোড দিয়ে নিজের জন্য এটি চেষ্টা করতে পারেন ...

using System;
using System.IO;
using System.Linq;
using System.Reflection;

namespace SO6921105
{
    internal class PathExtractionResult
    {
        public string Description { get; set; }
        public string Method { get; set; }
        public string Path { get; set; }
        public string Result { get; set; }
    }

    public static class Program
    {
        private static string GetFileBaseNameUsingSplit(string path)
        {
            string[] pathArr = path.Split('\\');
            string[] fileArr = pathArr.Last().Split('.');
            string fileBaseName = fileArr.First().ToString();

            return fileBaseName;
        }

        private static string GetFileBaseNameUsingPath(string path)
        {
            return Path.GetFileNameWithoutExtension(path);
        }

        private static string GetFileBaseNameUsingSubstringUnsafe(string path)
        {
            // Fails on paths with no file extension - DO NOT USE!!
            int startIndex = path.LastIndexOf('\\') + 1;
            int endIndex = path.IndexOf('.', startIndex);
            string fileBaseName = path.Substring(startIndex, endIndex - startIndex);

            return fileBaseName;
        }

        private static string GetFileBaseNameUsingSubstringSafe(string path)
        {
            int startIndex = path.LastIndexOf('\\') + 1;
            int endIndex = path.IndexOf('.', startIndex);
            int length = (endIndex >= 0 ? endIndex : path.Length) - startIndex;
            string fileBaseName = path.Substring(startIndex, length);

            return fileBaseName;
        }

        public static void Main()
        {
            MethodInfo[] testMethods = typeof(Program).GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
                .Where(method => method.Name.StartsWith("GetFileBaseName"))
                .ToArray();
            var inputs = new[] {
                new { Description = "Single extension",      Path = @"C:\Program Files\hello.txt"     },
                new { Description = "Double extension",      Path = @"C:\Program Files\hello.txt.ext" },
                new { Description = "No extension",          Path = @"C:\Program Files\hello"         },
                new { Description = "Leading period",        Path = @"C:\Program Files\.hello.txt"    },
                new { Description = "Trailing period",       Path = @"C:\Program Files\hello.txt."    },
                new { Description = "Directory path",        Path = @"C:\Program Files\"              },
                new { Description = "Current file path",     Path = "hello.txt"                       },
                new { Description = "Parent file path",      Path = @"..\hello.txt"                   },
                new { Description = "Parent directory path", Path = ".."                              }
            };
            PathExtractionResult[] results = inputs
                .SelectMany(
                    input => testMethods.Select(
                        method => {
                            string result;

                            try
                            {
                                string returnValue = (string) method.Invoke(null, new object[] { input.Path });

                                result = $"\"{returnValue}\"";
                            }
                            catch (Exception ex)
                            {
                                if (ex is TargetInvocationException)
                                    ex = ex.InnerException;
                                result = $"EXCEPTION: {ex.Message}";
                            }

                            return new PathExtractionResult() {
                                Description = input.Description,
                                Method = $"{method.Name}()",
                                Path = $"\"{input.Path}\"",
                                Result = result
                            };
                        }
                    )
                ).ToArray();
            const int ColumnPadding = 2;
            ResultWriter writer = new ResultWriter(Console.Out) {
                DescriptionColumnWidth = results.Max(output => output.Description.Length) + ColumnPadding,
                MethodColumnWidth = results.Max(output => output.Method.Length) + ColumnPadding,
                PathColumnWidth = results.Max(output => output.Path.Length) + ColumnPadding,
                ResultColumnWidth = results.Max(output => output.Result.Length) + ColumnPadding,
                ItemLeftPadding = " ",
                ItemRightPadding = " "
            };
            PathExtractionResult header = new PathExtractionResult() {
                Description = nameof(PathExtractionResult.Description),
                Method = nameof(PathExtractionResult.Method),
                Path = nameof(PathExtractionResult.Path),
                Result = nameof(PathExtractionResult.Result)
            };

            writer.WriteResult(header);
            writer.WriteDivider();
            foreach (IGrouping<string, PathExtractionResult> resultGroup in results.GroupBy(result => result.Description))
            {
                foreach (PathExtractionResult result in resultGroup)
                    writer.WriteResult(result);
                writer.WriteDivider();
            }
        }
    }

    internal class ResultWriter
    {
        private const char DividerChar = '-';
        private const char SeparatorChar = '|';

        private TextWriter Writer { get; }

        public ResultWriter(TextWriter writer)
        {
            Writer = writer ?? throw new ArgumentNullException(nameof(writer));
        }

        public int DescriptionColumnWidth { get; set; }

        public int MethodColumnWidth { get; set; }

        public int PathColumnWidth { get; set; }

        public int ResultColumnWidth { get; set; }

        public string ItemLeftPadding { get; set; }

        public string ItemRightPadding { get; set; }

        public void WriteResult(PathExtractionResult result)
        {
            WriteLine(
                $"{ItemLeftPadding}{result.Description}{ItemRightPadding}",
                $"{ItemLeftPadding}{result.Method}{ItemRightPadding}",
                $"{ItemLeftPadding}{result.Path}{ItemRightPadding}",
                $"{ItemLeftPadding}{result.Result}{ItemRightPadding}"
            );
        }

        public void WriteDivider()
        {
            WriteLine(
                new string(DividerChar, DescriptionColumnWidth),
                new string(DividerChar, MethodColumnWidth),
                new string(DividerChar, PathColumnWidth),
                new string(DividerChar, ResultColumnWidth)
            );
        }

        private void WriteLine(string description, string method, string path, string result)
        {
            Writer.Write(SeparatorChar);
            Writer.Write(description.PadRight(DescriptionColumnWidth));
            Writer.Write(SeparatorChar);
            Writer.Write(method.PadRight(MethodColumnWidth));
            Writer.Write(SeparatorChar);
            Writer.Write(path.PadRight(PathColumnWidth));
            Writer.Write(SeparatorChar);
            Writer.Write(result.PadRight(ResultColumnWidth));
            Writer.WriteLine(SeparatorChar);
        }
    }
}

টিএল; ডিআর প্রশ্নের কোডটি কোনও কোনও কোণায় যেমন প্রত্যাশা বলে মনে হয় তেমন আচরণ করে না । আপনি যদি নিজের পাথ ম্যানিপুলেশন কোডটি লিখতে চলেছেন তবে তা বিবেচনায় নেওয়ার বিষয়ে নিশ্চিত হন ...

  • ... আপনি কীভাবে একটি "এক্সটেনশন" সংজ্ঞায়িত করেন (এটি কি প্রথমের .আগে সবকিছু বা শেষের আগে সমস্ত কিছু. ?)
  • ... একাধিক এক্সটেনশানযুক্ত ফাইল
  • ... কোনও এক্সটেনশন ছাড়াই ফাইল
  • ... একটি নেতৃস্থানীয় ফাইল .
  • ... একটি পেছনযুক্ত ফাইলগুলি .(সম্ভবত এমন কোনও কিছু নয় যা আপনি উইন্ডোজে কখনও মুখোমুখি হবেন না, তবে সেগুলি সম্ভব )
  • ... "এক্সটেনশান" সহ ডিরেক্টরিগুলি বা অন্যথায় এগুলি অন্তর্ভুক্ত রয়েছে .
  • ... পাথ যে একটি দিয়ে শেষ হয় \
  • ... আপেক্ষিক পথ

সমস্ত ফাইল পাথের সাধারণ সূত্র অনুসরণ করে না X:\Directory\File.ext!


0
Namespace: using System.IO;  
 //use this to get file name dynamically 
 string filelocation = Properties.Settings.Default.Filelocation;
//use this to get file name statically 
//string filelocation = @"D:\FileDirectory\";
string[] filesname = Directory.GetFiles(filelocation); //for multiple files

Your path configuration in App.config file if you are going to get file name dynamically  -

    <userSettings>
        <ConsoleApplication13.Properties.Settings>
          <setting name="Filelocation" serializeAs="String">
            <value>D:\\DeleteFileTest</value>
          </setting>
              </ConsoleApplication13.Properties.Settings>
      </userSettings>

প্রশ্নটি জিজ্ঞাসা করছে কিভাবে কোনও ফাইল পাথ থেকে এক্সটেনশন ছাড়াই ফাইলটির নাম বের করা যায়। পরিবর্তে এটি একটি ডিরেক্টরিটির তাত্ক্ষণিক চাইল্ড ফাইলগুলি উদ্ধার করছে যা কোনও কনফিগারেশন ফাইল দ্বারা নির্দিষ্ট করা বা নাও হতে পারে। এগুলি আসলে একই জিনিসটির খুব কাছের নয়।
বাকন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.