সি ++ 17 দিয়ে কীভাবে ফাইলের আকার বাইট পাবেন


98

নির্দিষ্ট অপারেটিং সিস্টেমের জন্য সমস্যাগুলি রয়েছে, আমার জানা উচিত?

এই প্রশ্নের অনেকগুলি নকল রয়েছে ( 1 , 2 , 3 , 4 , 5 ) তবে সেগুলির উত্তর দশক আগে দেওয়া হয়েছিল। এই অনেক প্রশ্নের মধ্যে খুব উচ্চ ভোটের উত্তরগুলি আজ ভুল।

.Sx এ অন্য (পুরাতন কিউএ) থেকে প্রাপ্ত পদ্ধতি

  • stat.h (মোড়কের sprintstatf ), ব্যবহারসমূহ প্রাপ্ত syscall

  • টেলগ () , প্রতি সংজ্ঞা প্রতি পজিশন দেয় তবে অগত্যা বাইট হয় না । রিটার্ন টাইপ হয় না int



5
@ এলএফ: আচ্ছা, প্রথম প্রশ্নটি দ্বিতীয়টির নকল হিসাবে বন্ধ করা হয়েছে, যা প্রথমটিতে গৃহীত উত্তর কেন ভুল তা ব্যাখ্যা করে । তৃতীয়টি অনুরূপ tellgসমস্যাগুলি সম্পর্কে জিজ্ঞাসা করছে । একমাত্র বিরক্ত করার মতো মূল্য হ'ল চতুর্থটি এবং এটি যে দুর্দান্ত নয়, যেহেতু এটি ofstreamপ্রশ্ন এবং এর উত্তর উভয় ক্ষেত্রেই খুব বেশি কথা বলে । এইটি অন্যের তুলনায় অভিপ্রায় প্রকাশের ক্ষেত্রে আরও ভাল (প্রথমটি বাদে, যা অদ্ভুতভাবে বন্ধ রয়েছে)।
নিকল বোলাস

6
আপনার প্রশ্ন এবং প্রশ্নের শিরোনামে অপ্রাসঙ্গিক তথ্য যুক্ত করা বন্ধ করুন। বছরটি অপ্রাসঙ্গিক; প্রযুক্তিগুলি প্রাসঙ্গিক।
এলেক্সেনাইড

4
কি সমস্যা রয়েছে stat(2)কোন পথে? এটি কি খুব বেশি বয়স হয়ে গেছে বা কী হয়েছে?
লরিঞ্জি জিসিগমন্ড

4
@ লরিঞ্জিজেডসিগমন্ড কীstat(2) ঘটছে এটি ভাষা মানের অংশ নয়।
অ্যান্ড্রু হেনেল

উত্তর:


124

<filesystem>(সি ++ 17 এ যুক্ত) এটি খুব সোজা করে তোলে ।

#include <cstdint>
#include <filesystem>

// ...

std::uintmax_t size = std::filesystem::file_size("c:\\foo\\bar.txt");

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

... ফাইলটি যদি আপনার দ্বারা একচেটিয়াভাবে না খোলা হয় তবে এর আকারটি আপনি চাওয়ার সময় এবং এটি থেকে ডেটা পড়ার চেষ্টা করার সময়ের মধ্যে পরিবর্তন করা যেতে পারে।
- নিকোল বোলাস


11
লিটল অফটোপিক: এমন এক পৃথিবী আছে যেখানে এর std::uintmax_tচেয়ে বেশি মান রাখতে সক্ষম হবে std::size_t? যদি তা না হয় তবে কেন ব্যবহার করবেন না std::size_t, কোনটি যুক্তিযুক্তরূপে বেশি স্বীকৃত? উত্তরে +1,
বিটিডব্লিউ

13
@ ফুরিশ আমি কেবল টাইপ file_sizeরিটার্নের কারণে ব্যবহার করেছি । আমার কাছেও কিছুটা অদ্ভুত লাগছে।
হলিব্ল্যাকগেট

39
@ ফিউরিশকে std::size_tকেবল মেমরি অবজেক্টের সর্বাধিক আকার ধারণ করতে হবে। ফাইলগুলি যথেষ্ট বড় হতে পারে
রিচার্ড ক্রিটেন

27
@ ফিউরিশ ওয়েল, 32-বিট উইন্ডোতে (এবং আমি বেশিরভাগ আধুনিক 32-বিট প্ল্যাটফর্ম ধরে নিয়েছি) size_t32 বিট, এবং uintmax_t64 বিট।
হলিব্ল্যাকগেট

16
@HolyBlackCat: এটা ভাল এটা সত্য যে ফাইলসিস্টেম বিশ্বব্যাপী, এবং এইভাবে যদি না ফাইল সম্পর্কে কিছু বলতে হবে একচেটিয়াভাবে আপনি দ্বারা খোলা, এর আকার সময় আপনি এটি জন্য জিজ্ঞাসা করুন এবং সময় আপনি ডেটা পড়তে চেষ্টা মধ্যে পরিবর্তন করা যাবে ইহা হতে.
নিকল বোলাস

28

সি ++ 17 এনে দেয় std::filesystemযা ফাইল এবং ডিরেক্টরিতে প্রচুর কাজ স্ট্রিমলাই করে। কেবলমাত্র আপনি দ্রুত ফাইলের আকার, তার বৈশিষ্ট্যগুলি পেতে পারবেন না, তবে নতুন ডিরেক্টরি তৈরি করতে পারেন, ফাইলগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন, পাথ অবজেক্টের সাথে কাজ করতে পারেন।

নতুন লাইব্রেরি আমাদের দুটি ফাংশন দেয় যা আমরা ব্যবহার করতে পারি:

std::uintmax_t std::filesystem::file_size( const std::filesystem::path& p );

std::uintmax_t std::filesystem::directory_entry::file_size() const;

প্রথম ফাংশনটি একটি ফ্রি ফাংশন std::filesystem, দ্বিতীয়টি হল একটি পদ্ধতি directory_entry

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

#include <chrono>
#include <filesystem>  
#include <iostream>

namespace fs = std::filesystem;

int main(int argc, char* argv[])
{
    try
    {
        const auto fsize = fs::file_size("a.out");
        std::cout << fsize << '\n';
    }
    catch (const fs::filesystem_error& err)
    {
        std::cerr << "filesystem error! " << err.what() << '\n';
        if (!err.path1().empty())
            std::cerr << "path1: " << err.path1().string() << '\n';
        if (!err.path2().empty())
            std::cerr << "path2: " << err.path2().string() << '\n';
    }
    catch (const std::exception& ex)
    {
        std::cerr << "general exception: " << ex.what() << '\n';
    }

    // using error_code
    std::error_code ec{};
    auto size = std::filesystem::file_size("a.out", ec);
    if (ec == std::error_code{})
        std::cout << "size: " << size << '\n';
    else
        std::cout << "error when accessing test file, size is: " 
              << size << " message: " << ec.message() << '\n';
}

4
"এই" আসলে কি? এই কোডটি কীসের জন্য ব্যবহৃত হয় তা আপনি ব্যাখ্যা করতে পারেন, বিশেষত যখন গৃহীত উত্তরটি খুব কম কোড ব্যবহার করে?
নিকো হায়েস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.