প্রথমত, প্রশ্নের কোড বর্ণিত আউটপুট উত্পাদন করে না। এটি ফাইলের এক্সটেনশন ( "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
!
Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")
একই স্ট্রিংটি ফিরিয়ে দেওয়া হচ্ছে এবং কোনও কারণে এটিকে "file.cs" এ রূপান্তর করা হচ্ছে না। আমি যদি আমার কোডটি কোনও অনলাইন সংকলক ( রেক্সটেসটার ডট কমের মত ) অনুলিপি / পেস্ট করি তবে এটি কাজ করে ...?