C ++ 17 के साथ बाइट्स में फ़ाइल का आकार कैसे प्राप्त करें


97

क्या विशिष्ट ऑपरेटिंग सिस्टम के लिए नुकसान हैं, मुझे पता होना चाहिए?

इस प्रश्न के कई डुप्लिकेट ( 1 , 2 , 3 , 4 , 5 ) हैं , लेकिन उनका उत्तर दशकों पहले दिया गया था। इनमें से कई सवालों के बहुत ही उच्च मतदान के उत्तर आज गलत हैं।

.Sx पर अन्य (पुराने QA के) से विधियाँ

  • stat.h (आवरण स्प्रिंटस्टैटफ ), syscall का उपयोग करता है

  • टेल्ग () , प्रति स्थिति में प्रतिफल देता है, लेकिन जरूरी नहीं कि बाइट्स । वापसी का प्रकार नहीं है int


4
10 के लिए स्टार्टर: en.cppreference.com/w/cpp/header/filesystem
रिचर्ड क्रिट

5
@ एलएफ: ठीक है, पहले प्रश्न को दूसरे के डुप्लिकेट के रूप में बंद कर दिया गया है, जो बताता है कि पहले में स्वीकृत उत्तर गलत क्यों है । तीसरा व्यक्ति ऐसी ही tellgसमस्याओं के बारे में पूछ रहा है। केवल एक ही परेशान करने वाला चौथा है, और यह कोई भी महान नहीं है, क्योंकि यह ofstreamप्रश्न और इसके उत्तर दोनों के बारे में बहुत अधिक बात करता है। यह दूसरों की तुलना में इरादे को व्यक्त करने में बहुत बेहतर है (पहले को छोड़कर, जो अजीब तरह से बंद है)।
निकोल बोलस

6
कृपया अपने प्रश्न और प्रश्न शीर्षक में अप्रासंगिक जानकारी जोड़ना बंद करें। वर्ष अप्रासंगिक है; प्रौद्योगिकियां प्रासंगिक हैं।
एलिक्सनाइड

2
stat(2)वैसे भी क्या गलत है ? क्या यह बहुत पुराना हो गया है या क्या?
लोरिनज़ी ज़िग्डमंड

1
@LorinczyZsigmond भाषा के मानक का हिस्सा नहीं होने के साथ क्या गलत हैstat(2)
एंड्रयू हेनले

जवाबों:


123

<filesystem>(C ++ 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, btw
फ्यूरिश

13
@Fureeish मैंने सिर्फ इसलिए इस्तेमाल किया क्योंकि वह टाइप file_sizeरिटर्न है। मुझे भी थोड़ा अजीब लगता है।
होलीब्लैककट

39
@Fureeish std::size_tकेवल मेमोरी ऑब्जेक्ट्स के अधिकतम आकार को रखने के लिए आवश्यक है। फाइलें काफी बड़ी हो सकती हैं,
रिचर्ड क्रिटेन

26
@Fureeish खैर, 32-बिट विंडोज पर (और मैं सबसे आधुनिक 32-बिट प्लेटफार्मों पर) size_t32 बिट्स, और uintmax_t64 बिट्स मान रहा हूं ।
होलीब्लैककट

16
@HolyBlackCat: इस तथ्य के बारे में कुछ कहना अच्छा होगा कि फाइलसिस्टम वैश्विक है, और इस प्रकार जब तक कि फ़ाइल आपके द्वारा विशेष रूप से नहीं खोली जाती है, इसका आकार आपके द्वारा मांगे जाने वाले समय और आपके द्वारा डेटा पढ़ने की कोशिश के बीच में बदला जा सकता है। इसमें से।
निकोल बोलस

28

C ++ 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';
}

2
वास्तव में "यह" क्या है? क्या आप बता सकते हैं कि यह सब कोड किस लिए उपयोग किया जाता है, खासकर जब स्वीकृत उत्तर बहुत कम कोड का उपयोग करता है?
निको हासे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.