সি # তে কীভাবে অনন্য ফাইলের নাম তৈরি করা যায়


131

আমি একটি অ্যালগরিদম প্রয়োগ করেছি যা হার্ড ড্রাইভে সংরক্ষণ করবে এমন ফাইলগুলির জন্য অনন্য নাম তৈরি করবে। আমি সংযুক্ত করছি DateTime: ঘন্টা, মিনিট, দ্বিতীয় এবং মিলিসেকেন্ড তবে এটি ফাইলের সদৃশ নাম উত্পন্ন করে কারণ আমি একসাথে একাধিক ফাইল আপলোড করি।

হার্ড ড্রাইভে সংরক্ষণের জন্য ফাইলগুলির জন্য অনন্য নাম উত্পন্ন করার সর্বোত্তম সমাধান কী?


এটি অন্যান্য প্রয়োজনীয়তার উপর নির্ভর করে; এই [পুরানো] প্রশ্নটি / খুব অস্পষ্ট ছিল।
ব্যবহারকারী 2864740

উত্তর:


240

পাঠযোগ্যতা ব্যাপার না করেন, ব্যবহার GUIDs

উদাহরণ:

var myUniqueFileName = string.Format(@"{0}.txt", Guid.NewGuid());

বা সংক্ষিপ্ত :

var myUniqueFileName = $@"{Guid.NewGuid()}.txt";

আমার প্রোগ্রামগুলিতে আমি মাঝে মাঝে একটি পাঠযোগ্য নাম ("চিত্র 1.png"… "চিত্র 10.png") উত্পন্ন করার জন্য 10 বার চেষ্টা করি এবং যদি তা ব্যর্থ হয় (কারণ ফাইলটি ইতিমধ্যে বিদ্যমান) তবে আমি জিআইডিগুলিতে ফিরে যাই।

হালনাগাদ:

সাম্প্রতিককালে, আমি DateTime.Now.Ticksজিআইডি'র পরিবর্তেও ব্যবহার করেছি :

var myUniqueFileName = string.Format(@"{0}.txt", DateTime.Now.Ticks);

অথবা

var myUniqueFileName = $@"{DateTime.Now.Ticks}.txt";

আমার উপকারটি হ'ল এটি জিইউডিগুলির তুলনায় একটি সংক্ষিপ্ত এবং "ভাল দেখাচ্ছে" ফাইলের নাম উত্পন্ন করে।

দয়া করে মনে রাখবেন যে কিছু ক্ষেত্রে (যেমন খুব অল্প সময়ে প্রচুর এলোমেলো নাম উত্পন্ন করার সময়), এটি অ-অনন্য মূল্যবোধ তৈরি করতে পারে

অন্য কম্পিউটারগুলিতে স্থানান্তরিত করার পরেও আপনি যদি ফাইলের নামগুলি অনন্য বলে নিশ্চিত করতে চান তবে জিইউডিগুলিতে আটকে থাকুন।


7
আমি জিআইডি হিসাবে টিক্স ব্যবহার করা সত্যই কুশ্রী। আপনি টিক্সের একটি হ্যাশ পেতে পারেন যা ফাইলটির অক্ষরের দৈর্ঘ্য হ্রাস করে। DateTime.Now.Ticks.GetHashCode().ToString("x").ToUpper()
উইলমিসকিল

4
"টিক্স" অনুমানযোগ্য এবং থ্রেড-নিরাপদ নয় (একই 'টিক্স' একাধিক থ্রেড / প্রক্রিয়াগুলি থেকে পাওয়া যেতে পারে)। এটি টেম্প ফাইল ফাইল তৈরির জন্য উপযুক্ত করে না। X..1..N উত্পন্ন করা ব্যবহারকারী-মুখোমুখি কার্যগুলির জন্য উপযুক্ত হতে পারে (যেমন এক্সপ্লোরারে অনুলিপি), তবে সার্ভার কাজের জন্য সন্দেহজনক।
ব্যবহারকারী 2864740

90

ব্যবহার

Path.GetTempFileName()

অথবা নতুন জিইউডি () ব্যবহার করুন।

এমএসডিএন-এ পাথ.গেটটেম্পফিলনাম ()


: এখানে দুটিই MSDN ডক লিংক msdn.microsoft.com/en-us/library/...
epotter

3
তবে মনে রাখবেন, GetTempFileName()আপনি যদি এ জাতীয় অনেকগুলি ফাইল মুছুন না করে তৈরি করেন তবে এটি ব্যতিক্রম হতে পারে।
জোয়ি

21
" পূর্ববর্তী অস্থায়ী ফাইলগুলি মোছা না করে 65535 টিরও বেশি ফাইল তৈরি করতে যদি এটি ব্যবহার করা হয় তবে getTempFileName পদ্ধতিটি একটি IOException উত্থাপন করবে " " এমএসডিএন নিবন্ধ বলেছেন।
ğağdaş টেকিন

1
সতর্কতা: একটি ফাইল তৈরিGetTempFileName করবে । এর অর্থ হ'ল এটি অস্থায়ী পথের অবস্থানটি চয়ন করে । অন্যদিকে, একটি 8.3 ফাইলের নাম উত্পন্ন করার জন্য উপযুক্ত যা ভিন্ন পথের সাথে ব্যবহার করা যেতে পারে। (আমি এমন কিছু ভয়াবহ কোড দেখেছি যা একটি ফাইলের সাথে গেটটেম্পফিলনাম ব্যবহার করে just ফাইলের নাম অন্য কোথাও ব্যবহার করতে GetRandomFileName
মুছুন

77

এখানে এমএসডিএন ডকটির
epotter

13
@ রাইবোল্ট: যেহেতু আপনার নিজের বীজ বানাতে হবে না সে পদ্ধতিটি ব্যবহারের জন্য আপনার মনে রাখার মতো অনেক কিছুই নেই। এবং আমি আশা করতে পারি যে বিপুল সংখ্যক বিকাশকারী কীভাবে সুরক্ষিত ক্রিপ্টোগ্রাফিক সিস্টেমগুলি তৈরি করবেন সে সম্পর্কে কোনও ধারণা রাখেনি।
জোয়ি

54

যদি ফাইলের নামটির পঠনযোগ্যতা গুরুত্বপূর্ণ না হয়, তবে অনেকের পরামর্শ অনুসারে জিইউডিটি করবে। যাইহোক, আমি দেখতে পেলাম যে 1000 জিইউইডি ফাইলের নাম সহ একটি ডিরেক্টরি অনুসন্ধান করা খুব সজ্জাজনক is সুতরাং আমি সাধারণত একটি স্ট্যাটিক স্ট্রিংয়ের সংমিশ্রণ ব্যবহার করি যা ফাইলটির নামটিকে কিছু প্রসঙ্গ তথ্য, একটি টাইমস্ট্যাম্প এবং জিইউডি দেয়।

উদাহরণ স্বরূপ:

public string GenerateFileName(string context)
{
    return context + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "_" + Guid.NewGuid().ToString("N");
}

filename1 = GenerateFileName("MeasurementData");
filename2 = GenerateFileName("Image");

এইভাবে, যখন আমি ফাইলের নাম অনুসারে বাছাই করব, এটি স্বয়ংক্রিয়ভাবে প্রসঙ্গের স্ট্রিং দ্বারা ফাইলগুলিকে গ্রুপ করবে এবং টাইমস্ট্যাম্প অনুসারে বাছাই করবে।

দ্রষ্টব্য যে উইন্ডোতে ফাইলের নাম সীমা 255 টি অক্ষর।


1
+1 পরামর্শের জন্য একটি জিইউডির সাথে মিলিত দরকারী তথ্য অন্তর্ভুক্ত করতে হবে । - এক ধরণের লবণের সাথে রাখার জন্য: কোনও ফাইলের নাম এবং তারিখ সহ একটি নালার ধরণ যখন আপনি ঠিক করতে পারেন Right Click > Sort By > Date
টিমোথি শিল্ডস

1
সময়টি কার্যকর হয় যদি আপনি একই ডিরেক্টরিতে বিভিন্ন প্রসঙ্গের সাথে একগুচ্ছ ফাইল সঞ্চয় করে থাকেন। অবশ্যই, ফাইলের নাম উত্পাদন আপনার নির্দিষ্ট প্রয়োজনের উপর ভিত্তি করে সামঞ্জস্য করা উচিত।
মাস

হওয়া উচিত Guid.NewGuid().ToString();। অনুপস্থিত বন্ধনী +1 অন্যথায়
লরেন্ট ডব্লিউ।

এটি খুব চতুর। টাইমস্ট্যাম্প এবং গাইড। +1
JoshYates1980

আমি এই সমাধানটি +1 পছন্দ করি, আমি একটি দ্বিতীয় প্যারামিটার স্ট্রিং এক্সটেনশন যুক্ত করেছি যা আমি ফাইলনেমে যুক্ত করি, এটি প্রসঙ্গের ধারণাটিকে সমর্থন করে এবং প্রয়োজনে ডাবল ক্লিকের সাথে সহজেই ডিফল্ট অ্যাপ্লিকেশন দিয়ে ফাইলটি খোলার অনুমতি দেয়
শেলপাইপারের

23

এখানে একটি অ্যালগরিদম যা মূল সরবরাহিত উপর ভিত্তি করে একটি অনন্য পঠনযোগ্য ফাইলের নাম দেয়। যদি মূল ফাইলটি বিদ্যমান থাকে তবে অস্তিত্বহীন এমন একটিটি না পাওয়া পর্যন্ত এটি ক্রমান্বয়ে ফাইলের নামের সাথে একটি সূচক যুক্ত করার চেষ্টা করে। সংঘর্ষের জন্য এটি পরীক্ষা করার জন্য এটি বিদ্যমান ফাইলের নামগুলি হ্যাশসেটে পড়ে তাই এটি খুব দ্রুত (আমার মেশিনে প্রতি সেকেন্ডে কয়েক শত ফাইলের নাম), এটিও থ্রেড নিরাপদ, এবং জাতিগত অবস্থার মধ্যে পড়ে না।

উদাহরণস্বরূপ, আপনি যদি এটি পাস করেন তবে test.txtএটি এই ক্রমে ফাইলগুলি তৈরি করার চেষ্টা করবে:

test.txt
test (2).txt
test (3).txt

ইত্যাদি আপনি সর্বাধিক প্রচেষ্টা নির্দিষ্ট করতে পারেন বা এটি ডিফল্টে রেখে যেতে পারেন leave

এখানে একটি সম্পূর্ণ উদাহরণ:

class Program
{
    static FileStream CreateFileWithUniqueName(string folder, string fileName, 
        int maxAttempts = 1024)
    {
        // get filename base and extension
        var fileBase = Path.GetFileNameWithoutExtension(fileName);
        var ext = Path.GetExtension(fileName);
        // build hash set of filenames for performance
        var files = new HashSet<string>(Directory.GetFiles(folder));

        for (var index = 0; index < maxAttempts; index++)
        {
            // first try with the original filename, else try incrementally adding an index
            var name = (index == 0)
                ? fileName
                : String.Format("{0} ({1}){2}", fileBase, index, ext);

            // check if exists
            var fullPath = Path.Combine(folder, name);
            if(files.Contains(fullPath))
                continue;

            // try to create the file
            try
            {
                return new FileStream(fullPath, FileMode.CreateNew, FileAccess.Write);
            }
            catch (DirectoryNotFoundException) { throw; }
            catch (DriveNotFoundException) { throw; }
            catch (IOException) 
            {
                // Will occur if another thread created a file with this 
                // name since we created the HashSet. Ignore this and just
                // try with the next filename.
            } 
        }

        throw new Exception("Could not create unique filename in " + maxAttempts + " attempts");
    }

    static void Main(string[] args)
    {
        for (var i = 0; i < 500; i++)
        {
            using (var stream = CreateFileWithUniqueName(@"c:\temp\", "test.txt"))
            {
                Console.WriteLine("Created \"" + stream.Name + "\"");
            }
        }

        Console.ReadKey();
    }
}

থ্রেড-নিরাপদ ? নাstatic readonly পরিবর্তনশীল তন্ন তন্নlock?
কিকিনেট

পদ্ধতিটি নিজেই অচল তাই কিছুই ভাগ করে না, তাই আমি বিশ্বাস করি যে একাধিক থ্রেড নিরাপদে এই পদ্ধতিতে একই সাথে প্রবেশ করতে পারে। সম্ভবত থ্রেড-সেফটি পুরোপুরি সঠিক শব্দটি নয় - আমি বোঝানোর চেষ্টা করছি যে অন্য কোনও থ্রেড / প্রক্রিয়া যদি মৃত্যুদন্ডের সময় বিরোধী নাম সহ একটি ফাইল তৈরি করে তবে এই পদ্ধতিটি পরবর্তী উপলব্ধ নামটি পুনরুদ্ধার করে এবং চেষ্টা করে। এটিকে উন্নত করা যায় বলে আপনি নির্দ্বিধায় এডিট করুন।
মাইক চেম্বারলাইন

হতে পারে "রেসের শর্তে ভুগছেন না" এটি রাখার আরও ভাল উপায়।
মাইক চেম্বারলাইন

10

আমি getRandomFileName ব্যবহার করি :

GetRandomFileName পদ্ধতিটি একটি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী, এলোমেলো স্ট্রিং দেয় যা ফোল্ডারের নাম বা কোনও ফাইলের নাম হিসাবে ব্যবহার করা যেতে পারে। GetTempFileName থেকে পৃথক, getRandomFileName একটি ফাইল তৈরি করে না। আপনার ফাইল সিস্টেমের সুরক্ষা যখন সর্বজনীন হয়, এই পদ্ধতিটি getTempFileName এর পরিবর্তে ব্যবহার করা উচিত।

উদাহরণ:

public static string GenerateFileName(string extension="")
{
    return string.Concat(Path.GetRandomFileName().Replace(".", ""),
        (!string.IsNullOrEmpty(extension)) ? (extension.StartsWith(".") ? extension : string.Concat(".", extension)) : "");
}

GetRandomFileName () পদ্ধতিটি কি সর্বদা জিইউইডি () এর অনুরূপ অনন্য ফাইলের নাম তৈরি করে?
আশীষ শুকলা

1
@ আশিষশুকলা আসলে আমার ধারণা নেই। এমএসডিএন বলেছে "একটি ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী, এলোমেলো স্ট্রিং" উত্পন্ন হয়েছে। এখনও পর্যন্ত আমার কোনও সমস্যা হয়নি। স্বতন্ত্রতাটি যদি সমালোচনামূলক হয় তবে একটি অতিরিক্ত চেকটি ভাল ধারণা হতে পারে।
Koray

3
  1. আপনার স্বাভাবিক প্রক্রিয়া অনুসরণ করে আপনার টাইমস্ট্যাম্পড ফাইল নাম তৈরি করুন
  2. ফাইলের নাম বিদ্যমান কিনা তা পরীক্ষা করে দেখুন
  3. মিথ্যা - ফাইল সংরক্ষণ করুন
  4. সত্য - ফাইলের অতিরিক্ত অক্ষর যুক্ত করুন, সম্ভবত একটি কাউন্টার
  5. পদক্ষেপ 2 এ যান

10
এই অ্যালগরিদম সমঝোতার পক্ষে
সাবলীল

3

আপনার কাছে কোনও কাস্টম পদ্ধতি ছাড়াই স্বয়ংক্রিয়ভাবে এক অনন্য ফাইলের নাম তৈরি হতে পারে। শুধু সঙ্গে নিম্নলিখিত ব্যবহার StorageFolder ক্লাস বা StorageFile ক্লাস । এখানে মূল কী: CreationCollisionOption.GenerateUniqueNameএবংNameCollisionOption.GenerateUniqueName

একটি অনন্য ফাইল নাম সহ একটি নতুন ফাইল তৈরি করতে :

var myFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("myfile.txt", NameCollisionOption.GenerateUniqueName);

একটি অনন্য ফাইলের নাম সহ কোনও স্থানে একটি ফাইল অনুলিপি করতে :

var myFile2 = await myFile1.CopyAsync(ApplicationData.Current.LocalFolder, myFile1.Name, NameCollisionOption.GenerateUniqueName);

করার সরাতে গন্তব্য স্থানে একটি অনন্য ফাইলের নাম সহ একটি ফাইল:

await myFile.MoveAsync(ApplicationData.Current.LocalFolder, myFile.Name, NameCollisionOption.GenerateUniqueName);

গন্তব্যস্থানে কোনও অনন্য ফাইল নাম সহ কোনও ফাইলের নাম পরিবর্তন করতে :

await myFile.RenameAsync(myFile.Name, NameCollisionOption.GenerateUniqueName);

2

আমি নিম্নলিখিত কোড এবং এর কাজ সূক্ষ্ম ব্যবহার করা হয়। আমি আশা করি এটি আপনাকে সাহায্য করতে পারে।

আমি টাইমস্ট্যাম্প ব্যবহার করে একটি অনন্য ফাইলের নাম দিয়ে শুরু করি -

"কনটেক্সট_" + ডেটটাইম.নাউ.টোস্ট্রিং ("yyyymmddHHmmssffff")

সি # কোড -

public static string CreateUniqueFile(string logFilePath, string logFileName, string fileExt)
    {
        try
        {
            int fileNumber = 1;

            //prefix with . if not already provided
            fileExt = (!fileExt.StartsWith(".")) ? "." + fileExt : fileExt;

            //Generate new name
            while (File.Exists(Path.Combine(logFilePath, logFileName + "-" + fileNumber.ToString() + fileExt)))
                fileNumber++;

            //Create empty file, retry until one is created
            while (!CreateNewLogfile(logFilePath, logFileName + "-" + fileNumber.ToString() + fileExt))
                fileNumber++;

            return logFileName + "-" + fileNumber.ToString() + fileExt;
        }
        catch (Exception)
        {
            throw;
        }
    }

    private static bool CreateNewLogfile(string logFilePath, string logFile)
    {
        try
        {
            FileStream fs = new FileStream(Path.Combine(logFilePath, logFile), FileMode.CreateNew);
            fs.Close();
            return true;
        }
        catch (IOException)   //File exists, can not create new
        {
            return false;
        }
        catch (Exception)     //Exception occured
        {
            throw;
        }
    }

1

আপনার কি ফাইলনামে ডেট টাইম স্ট্যাম্প দরকার?

আপনি ফাইলের নামটি জিইউডি করতে পারেন।


@ ডাউনভোটার ডাউন ভোটের কোনও কারণ? ফাইল নামের একটি জিআইডি এই প্রশ্নের একটি জনপ্রিয় উত্তর বলে মনে হচ্ছে।
ল্যারি হিপ

এটি একটি পুনরাবৃত্তি উত্তর, এবং
ডাউনওয়োটে

@XMLforDummy আমার উত্তর প্রথম এক ছিল। এটি এখনকার মতো মনে হচ্ছে না কারণ এটি এখনই ঘন্টাগুলি দেখায়। এটি একটি পুনরাবৃত্তি উত্তর কারণ এটি সম্ভবত সঠিক উত্তর।
ল্যারি হিপ


1

Guid.NewGuid()একটি জিইউইডি তৈরি করতে কীভাবে ব্যবহার করবেন এবং ফাইল নাম হিসাবে এটি ব্যবহার করুন (বা যদি আপনি চান তবে টাইম স্ট্যাম্পের সাথে ফাইলের কিছু অংশ)।


1

আমি একটি সাধারণ পুনরাবৃত্তি ফাংশন লিখেছি যা উইন্ডোজের মতো ফাইলের নাম উত্পন্ন করে, ফাইল এক্সটেনশনের পূর্বে একটি ক্রম সংখ্যা যুক্ত করে app

একটি কাঙ্ক্ষিত ফাইল পাথ দেওয়া হয়েছে C:\MyDir\MyFile.txtএবং ফাইলটি ইতিমধ্যে বিদ্যমান রয়েছে, এটির একটি চূড়ান্ত ফাইল পাথ ফিরে আসে C:\MyDir\MyFile_1.txt

এটিকে এভাবে বলা হয়:

var desiredPath = @"C:\MyDir\MyFile.txt";
var finalPath = UniqueFileName(desiredPath);

private static string UniqueFileName(string path, int count = 0)
{
    if (count == 0)
    {
        if (!File.Exists(path))
        {
            return path;
        }
    }
    else
    {
        var candidatePath = string.Format(
            @"{0}\{1}_{2}{3}",
            Path.GetDirectoryName(path),
            Path.GetFileNameWithoutExtension(path),
            count,
            Path.GetExtension(path));

        if (!File.Exists(candidatePath))
        {
            return candidatePath;
        }
    }

    count++;
    return UniqueFileName(path, count);
}

এটি থ্রেড-নিরাপদ বা প্রক্রিয়া-নিরাপদ নয়। ফাইলটির সাথে একটি রেস-শর্ত রয়েছে x তুচ্ছভাবে, যখন কোনও ফাইল না তৈরি করে পরপর দু'বার ফোন করা হয় তখন একই ফলাফলটি ফিরে আসবে।
ব্যবহারকারী 2864740

1

নীচের মতো আমরা কেন একটি অনন্য আইডি তৈরি করতে পারি না।

আমরা একসাথে একত্রিত করতে এবং একটি অনন্য আইডি তৈরি করতে ডেটটাইম.নু.টিক্স এবং গাইড.ইউ নিউগুইড ()। টুস্ট্রিং () ব্যবহার করতে পারি।

ডেটটাইম.নিউ.টিক্স যুক্ত হওয়ার সাথে সাথে আমরা অনন্য আইডি তৈরি হওয়ার সময় সেকেন্ডে তারিখ এবং সময় সন্ধান করতে পারি।

দয়া করে কোডটি দেখুন।

var ticks = DateTime.Now.Ticks;
var guid = Guid.NewGuid().ToString();
var uniqueSessionId = ticks.ToString() +'-'+ guid; //guid created by combining ticks and guid

var datetime = new DateTime(ticks);//for checking purpose
var datetimenow = DateTime.Now;    //both these date times are different.

আমরা এমনকি অনন্য আইডিতে টিকসের অংশ নিতে পারি এবং ভবিষ্যতের রেফারেন্সের জন্য পরে তারিখ এবং সময় পরীক্ষা করতে পারি।

আপনি ফাইলের নামের তৈরি অনন্য আইডি সংযুক্ত করতে পারেন বা আমাদের অ্যাপ্লিকেশন বা ওয়েবসাইটে ব্যবহারকারীদের লগ-ইন-লগআউটের জন্য অনন্য সেশন আইডি তৈরি করতে ব্যবহার করতে পারেন।


জিইউইডি থাকলে সেখানে 'টিক্স' দিয়ে কেন বিরক্ত করবেন?
ব্যবহারকারী 2864740

যে কোনও দৃশ্যের সময়, যদি আপনি ইউনিকসেশনআইডি কখন তৈরি করা যায় তা পরীক্ষা করতে হবে, আপনি সঠিক সময়টি পাবেন। এবং সেই নির্দিষ্ট টিকটিতে জীবদ্দশায় একবার মাত্র আসবে।
জিনেশ উবন্তভিদা

তুচ্ছভাবে, টিক্স সম্পর্কে এই ধারণাটি অবৈধ: ১) একাধিক পর্যবেক্ষক একই 'টিক' দেখতে পাবেন (থ্রেড / প্রক্রিয়াগুলি ভাবেন) এবং ২) একই 'টিক' একই পর্যবেক্ষক একাধিকবার পর্যবেক্ষণ করতে পারেন, যদি দ্রুত জিজ্ঞাসা করা হয়।
ব্যবহারকারী 2864740

যাইহোক, দ্বারা শুধু ব্যবহার Guid.NewGuid (এবং আসলে এটি "ক্রিপ্টোগ্রাফি র্যান্ডম" যা কিছু ক্ষেত্রে সুদ হতে পারে নয় উপেক্ষা), আমরা যে জাহির পারেন, একটি যথেষ্ট উচ্চ সম্ভাবনা সঙ্গে যে আমরা প্রায় অন্যথায় পরোয়া করি না একটি অনন্য আইডি হবে উত্পন্ন করা - এটি 'টিক্স' এর চেয়ে অনেক বেশি গ্যারান্টি । সুতরাং, 'টিক্স' এর কোনও মান / ব্যবহার নেই এখানে ফাইলের নাম হিসাবে "গৌণ" ডেটা প্রত্যাশা করা হয়।
ব্যবহারকারী 2864740

(এফডাব্লুআইডাব্লু: আমি 'অনন্য সময়' সম্পর্কে ভাঙা পূর্বোক্ত
দৃ as়তার

0

আপনি যদি তারিখের সময়, ঘন্টা, মিনিট ইত্যাদি রাখতে চান তবে আপনি একটি স্ট্যাটিক ভেরিয়েবল ব্যবহার করতে পারেন। ফাইলের নামের সাথে এই পরিবর্তনকের মান যুক্ত করুন App আপনি একটি ফাইল তৈরি করার সময় 0 এবং বর্ধন দিয়ে কাউন্টার শুরু করতে পারেন। আপনার ফাইলটিতে কয়েক সেকেন্ডও রয়েছে বলে ফাইলের নামটি অবশ্যই অনন্য হয়ে উঠবে।


0

আমি সাধারণত এই লাইনের সাথে কিছু করি:

  • স্টেম ফাইলের নাম দিয়ে শুরু করুন ( work.dat1উদাহরণস্বরূপ)
  • এটি ক্রিয়েটনিউ দিয়ে তৈরি করার চেষ্টা করুন
  • যদি এটি কাজ করে, আপনি ফাইলটি পেয়েছেন, অন্যথায় ...
  • বর্তমান তারিখ / সময়টিকে ফাইলের সাথে মিশ্রন করুন ( work.2011-01-15T112357.datউদাহরণস্বরূপ)
  • ফাইল তৈরি করার চেষ্টা করুন
  • যদি এটি কাজ করে, আপনি ফাইলটি পেয়েছেন, অন্যথায় ...
  • ফাইলনেমে একঘেয়ে কাউন্টার মিশ্রিত করুন (work.2011-01-15T112357.0001.dat উদাহরণস্বরূপ (আমি জিইউডিগুলিকে অপছন্দ করি I আমি অর্ডার / পূর্বাভাস পছন্দ করি)
  • ফাইল তৈরি করার চেষ্টা করুন। আপনার জন্য কোনও ফাইল তৈরি না হওয়া অবধি কাউন্টারটিকে টিক দিয়ে ধরে আবার চেষ্টা করে চলুন।

এখানে একটি নমুনা শ্রেণি রয়েছে:

static class DirectoryInfoHelpers
{
    public static FileStream CreateFileWithUniqueName( this DirectoryInfo dir , string rootName )
    {
        FileStream fs = dir.TryCreateFile( rootName ) ; // try the simple name first

        // if that didn't work, try mixing in the date/time
        if ( fs == null )
        {
            string date = DateTime.Now.ToString( "yyyy-MM-ddTHHmmss" ) ;
            string stem = Path.GetFileNameWithoutExtension(rootName) ;
            string ext  = Path.GetExtension(rootName) ?? ".dat" ;

            ext = ext.Substring(1);

            string fn = string.Format( "{0}.{1}.{2}" , stem , date , ext ) ;
            fs = dir.TryCreateFile( fn ) ;

            // if mixing in the date/time didn't work, try a sequential search
            if ( fs == null )
            {
                int seq = 0 ;
                do
                {
                    fn = string.Format( "{0}.{1}.{2:0000}.{3}" , stem , date , ++seq , ext ) ;
                    fs = dir.TryCreateFile( fn ) ;
                } while ( fs == null ) ;
            }

        }

        return fs ;
    }

    private static FileStream TryCreateFile(this DirectoryInfo dir , string fileName )
    {
        FileStream fs = null ;
        try
        {
            string fqn = Path.Combine( dir.FullName , fileName ) ;

            fs = new FileStream( fqn , FileMode.CreateNew , FileAccess.ReadWrite , FileShare.None ) ;
        }
        catch ( Exception )
        {
            fs = null ;
        }
        return fs ;
    }

}

আপনি অ্যালগরিদমটি টুইঙ্ক করতে চাইতে পারেন (উদাহরণস্বরূপ ফাইলের নামের সাথে সবসময় সম্ভাব্য উপাদানগুলি ব্যবহার করুন)। প্রসঙ্গে নির্ভর করে - যদি আমি উদাহরণস্বরূপ লগ ফাইলগুলি তৈরি করতাম, যাতে আমি অস্তিত্বের বাইরে ঘুরিয়ে দিতে চাইতাম, আপনি চাইবেন যে তারা সবাই নামের সাথে একই প্যাটার্নটি ভাগ করে নেবে।

কোডটি নিখুঁত নয় (উদাহরণস্বরূপ পাস করা ডেটাতে কোনও চেক নেই)। এবং অ্যালগরিদম নিখুঁত নয় (যদি আপনি হার্ড ড্রাইভ পূরণ করেন বা মুখোমুখি অনুমতি, প্রকৃত I / O ত্রুটি বা অন্য ফাইল সিস্টেম ত্রুটিগুলি উদাহরণস্বরূপ, এটি অসীম লুপে স্থির থাকবে))


0

আমি ডে-মাস ইয়ার সেকেন্ড মিলিসেকেন্ড স্ট্রিং সহ জিইউইডের সাথে সমাপ্ত হয়েছি এবং আমি মনে করি এই সমাধানটি আমার দৃশ্যে বেশ ভাল is


0

আপনি এলোমেলো সংখ্যা তৈরি করতে র্যান্ডম.নেক্সট () ব্যবহার করতে পারেন। আপনি এমএসডিএন লিঙ্কটি দেখতে পারেন: http://msdn.microsoft.com/en-us/library/9b3ta19y.aspx


2
আমি এটি সুপারিশ করব না, কারণ এটি এলোমেলো হওয়ার দরকার নেই to এটি অনন্য হতে হবে।
সর্বাধিক

0

আমি এটি করার জন্য বিশেষত একটি ক্লাস লিখেছি। এটি একটি "বেস" অংশ (এক মিনিট সঠিক টাইমস্ট্যাম্পের ডিফল্ট) দিয়ে আরম্ভ করা হয় এবং এর পরে অনন্য নাম তৈরি করতে চিঠিগুলি সংযোজন করা হয়। সুতরাং, উত্পাদিত প্রথম স্ট্যাম্প যদি 1907101215a হয়, দ্বিতীয়টি 1907101215 বি হবে, তারপরে 1907101215c, এবং সেটার।

আমার যদি 25 টিরও বেশি অনন্য স্ট্যাম্পের প্রয়োজন হয় তবে আমি 25 টি গণনা করতে আনারি জেড ব্যবহার করি। সুতরাং, এটি 1907101215y, 1907101215za, 1907101215zb, ... 1907101215zy, 1907101215zza, 1907101215zzb, এবং আরও যায়। এটি গ্যারান্টি দেয় যে স্ট্যাম্পগুলি সর্বদা বর্ণানুক্রমিকভাবে তাদের ক্রম অনুসারে বাছাই করা হবে (যতক্ষণ না স্ট্যাম্পের পরের অক্ষরটি কোনও চিঠি নয়)।

এটি থ্রেড-নিরাপদ নয়, স্বয়ংক্রিয়ভাবে সময় আপডেট করে না এবং আপনার কয়েকশ স্ট্যাম্পের প্রয়োজন হলে দ্রুত ফুলে যায় তবে আমি এটি আমার প্রয়োজনের জন্য পর্যাপ্ত পাই।

/// <summary>
/// Class for generating unique stamps (for filenames, etc.)
/// </summary>
/// <remarks>
/// Each time ToString() is called, a unique stamp is generated.
/// Stamps are guaranteed to sort alphanumerically in order of generation.
/// </remarks>
public class StampGenerator
{
  /// <summary>
  /// All the characters which could be the last character in the stamp.
  /// </summary>
  private static readonly char[] _trailingChars =
  {
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
    'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
    'u', 'v', 'w', 'x', 'y'
  };

  /// <summary>
  /// How many valid trailing characters there are.
  /// </summary>
  /// <remarks>Should always equal _trailingChars.Length</remarks>
  public const int TRAILING_RANGE = 25;

  /// <summary>
  /// Maximum length of the stamp. Hard-coded for laziness.
  /// </summary>
  public const int MAX_LENGTH_STAMP = 28;

  /// <summary>
  /// Base portion of the stamp. Will be constant between calls.
  /// </summary>
  /// <remarks>
  /// This is intended to uniquely distinguish between instances.
  /// Default behavior is to generate a minute-accurate timestamp.
  /// </remarks>
  public string StampBase { get; }

  /// <summary>
  /// Number of times this instance has been called.
  /// </summary>
  public int CalledTimes { get; private set; }

  /// <summary>
  /// Maximum number of stamps that can be generated with a given base.
  /// </summary>
  public int MaxCalls { get; }

  /// <summary>
  /// Number of stamps remaining for this instance.
  /// </summary>
  public int RemainingCalls { get { return MaxCalls - CalledTimes; } }

  /// <summary>
  /// Instantiate a StampGenerator with a specific base.
  /// </summary>
  /// <param name="stampBase">Base of stamp.</param>
  /// <param name="calledTimes">
  /// Number of times this base has already been used.
  /// </param>
  public StampGenerator(string stampBase, int calledTimes = 0)
  {
    if (stampBase == null)
    {
      throw new ArgumentNullException("stampBase");
    }
    else if (Regex.IsMatch(stampBase, "[^a-zA-Z_0-9 \\-]"))
    {
      throw new ArgumentException("Invalid characters in Stamp Base.",
                                  "stampBase");
    }
    else if (stampBase.Length >= MAX_LENGTH_STAMP - 1)
    {
      throw new ArgumentException(
        string.Format("Stamp Base too long. (Length {0} out of {1})",
                      stampBase.Length, MAX_LENGTH_STAMP - 1), "stampBase");
    }
    else if (calledTimes < 0)
    {
      throw new ArgumentOutOfRangeException(
        "calledTimes", calledTimes, "calledTimes cannot be negative.");
    }
    else
    {
      int maxCalls = TRAILING_RANGE * (MAX_LENGTH_STAMP - stampBase.Length);
      if (calledTimes >= maxCalls)
      {
        throw new ArgumentOutOfRangeException(
          "calledTimes", calledTimes, string.Format(
            "Called Times too large; max for stem of length {0} is {1}.",
            stampBase.Length, maxCalls));
      }
      else
      {
        StampBase = stampBase;
        CalledTimes = calledTimes;
        MaxCalls = maxCalls;
      }
    }
  }

  /// <summary>
  /// Instantiate a StampGenerator with default base string based on time.
  /// </summary>
  public StampGenerator() : this(DateTime.Now.ToString("yMMddHHmm")) { }

  /// <summary>
  /// Generate a unique stamp.
  /// </summary>
  /// <remarks>
  /// Stamp values are orered like this:
  /// a, b, ... x, y, za, zb, ... zx, zy, zza, zzb, ...
  /// </remarks>
  /// <returns>A unique stamp.</returns>
  public override string ToString()
  {
    int zCount = CalledTimes / TRAILING_RANGE;
    int trailing = CalledTimes % TRAILING_RANGE;
    int length = StampBase.Length + zCount + 1;

    if (length > MAX_LENGTH_STAMP)
    {
      throw new InvalidOperationException(
        "Stamp length overflown! Cannot generate new stamps.");
    }
    else
    {
      CalledTimes = CalledTimes + 1;
      var builder = new StringBuilder(StampBase, length);
      builder.Append('z', zCount);
      builder.Append(_trailingChars[trailing]);
      return builder.ToString();
    }
  }
}

-1

DateTime.Now.Ticksনিরাপদ নয়, Guid.NewGuid()খুব কুৎসিত, যদি আপনার কিছু পরিষ্কার এবং প্রায় নিরাপদ প্রয়োজন হয় ( এটি 100% নিরাপদ নয় উদাহরণস্বরূপ যদি আপনি এটি 1 এমএসে 1,000,000 বার কল করেন ), চেষ্টা করুন:

Math.Abs(Guid.NewGuid().GetHashCode())

সুরক্ষিত বলতে আমার অর্থ অনন্য হওয়া নিরাপদ বলতে আপনি যখন খুব অল্প সময়ের মধ্যে কয়েক বার এমএস বলে থাকেন।


আমার সমাধান ডাউনভোটারে কোনও সমস্যা আছে? আমাকে বুঝতে দাও.
মেহেদী দেহঘানি

GetHashCodeপদ্ধতি একটি ফেরৎ int, যা 32 বিট পরিসর আছে যেহেতু একটি GUID, একটি 128-বিট পরিসর আছে এবং আরও অনেক কিছু অনন্য হওয়া করার সম্ভাবনা রয়েছে। আপনি যদি কোনও GUIDমানের বিন্যাস পছন্দ করেন না , তবে কেবল ToString("N")এটিতে কল করুন, যা ড্যাশগুলি সরিয়ে দেয়।
4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.