সি ++ এ কোনও ফাইল উপস্থিত রয়েছে কিনা তা যাচাই করার সর্বোত্তম উপায় কী? (ক্রস প্ল্যাটফর্ম)


97

সিগুলিতে কোনও ফাইল উপস্থিত রয়েছে কিনা তা যাচাই করার সবচেয়ে ভাল উপায়টি আমি উত্তরগুলি পড়েছি ? (ক্রস প্ল্যাটফর্ম) , তবে আমি ভাবছি যে স্ট্যান্ডার্ড সি ++ লিবস ব্যবহার করে এর থেকে আরও ভাল উপায় আছে কি? সাধারণত ফাইলটি খোলার চেষ্টা না করেই।

উভয়ই statএবং accessবেশ কিছু ungoogleable। #includeএগুলি আমার কী ব্যবহার করা উচিত ?


অ্যাক্সেসের জন্য <io.h> (যা আসলে _ অ্যাক্সেস হতে পারে)।
রব

হ্যাঁ, যেহেতু এখানে উল্লেখ করা হয়েছে।
c0m4

উত্তর:


170

বুস্ট :: ফাইল সিস্টেমটি ব্যবহার করুন :

#include <boost/filesystem.hpp>

if ( !boost::filesystem::exists( "myfile.txt" ) )
{
  std::cout << "Can't find my file!" << std::endl;
}

68
বিপুল তৃতীয় পক্ষের গ্রন্থাগার ইনস্টল করতে কিছু যে করতে একটি hazzle একটি বিট মনে করা হয় করা উচিত সহজ হতে
c0m4

89
বুস্ট একটি লাইব্রেরি যেখানে অবশেষে সি ++ স্ট্যান্ডার্ড লাইব্রেরির অংশ হয়ে উঠবে তার অনেকগুলি বিকাশ করা হয়। বুস্টের সাথে জড়িত ব্যক্তিদের মধ্যে অনেকগুলি সি ++ স্ট্যান্ডার্ডের সাথে জড়িত লোক। সুতরাং বুস্ট কেবল কোনও তৃতীয় পক্ষের লাইব্রেরি নয়। আপনি যদি সি ++ তে প্রোগ্রামিং করে থাকেন তবে আপনার বুস্ট ইনস্টল করা উচিত !
আন্দ্রেয়াস ম্যাগনুসন

আমি মনে করি মনে হচ্ছে যে বি :: এফএস :: নেটওয়ার্ক শেয়ারে অস্তিত্বের ফাইলগুলিতে "সত্য" উপস্থিত রয়েছে: "\\ মেশিন \ ভাগ করুন \ this_file_doesnt_exist" => সত্য।
গতবার

যদি আপনার সংকলক টিআর 1 বাস্তবায়ন নিয়ে আসে তবে আপনাকে বুস্ট ইনস্টল করার দরকার নেই। এটি std :: tr1 :: ফাইল সিস্টেমে থাকবে
নেমানজা ত্রিফুনোভিচ

4
আসলে ASFAIK এটি টিআর 1 তৈরি করেনি তবে পরবর্তী পর্যায়ে যুক্ত করা হবে। অফিসিয়াল টিআর 1
আন্দ্রেয়াস ম্যাগনুসন

41

জাতি শর্ত সম্পর্কে সতর্ক থাকুন: যদি ফাইলটি "বিদ্যমান" চেক এবং আপনি এটি খোলার সময়ের মধ্যে অদৃশ্য হয়ে যায়, আপনার প্রোগ্রামটি অপ্রত্যাশিতভাবে ব্যর্থ হবে।

ফাইলটি ওপেন করা, ব্যর্থতার জন্য যাচাই করা ভাল এবং যদি সবকিছু ঠিক থাকে তবে ফাইলটি দিয়ে কিছু করুন It's এটি সুরক্ষা-সমালোচনামূলক কোডের সাথে আরও গুরুত্বপূর্ণ।

সুরক্ষা এবং জাতি সম্পর্কিত শর্তাদি সম্পর্কে বিশদ: http://www.ibm.com/developerworks/library/l-sprace.html


30

আমি একজন খুশি উত্সাহী ব্যবহারকারী এবং অবশ্যই আন্দ্রেয়াসের সমাধানটি ব্যবহার করব। তবে যদি আপনার বুস্ট লিবসে অ্যাক্সেস না থাকে তবে আপনি স্ট্রিম লাইব্রেরিটি ব্যবহার করতে পারেন:

ifstream file(argv[1]);
if (!file)
{
    // Can't open file
}

এটি উত্সাহ দেওয়ার মতো ততটা সুন্দর নয়: ফাইল সিস্টেম :: যেহেতু ফাইলটি আসলে খোলা হবে ... তবে তারপরে এটি সাধারণত পরবর্তী কাজ যা আপনি যাইহোক করতে চান।


15
তবে এই কোডটির সাহায্যে আপনি যদি ফাইলে অনুমতি না পেয়ে থাকেন তবে যদি ক্লজটিতে প্রবেশ করতে পারেন তবে তা উপস্থিত রয়েছে। বেশিরভাগ ক্ষেত্রে এটি গুরুত্বপূর্ণ নয়, তবে এখনও উল্লেখ করার মতো।
scigor

4
লক্ষ্য ভাল () সত্য উৎপাদ যে যদি প্রদত্ত যুক্তি ডিরেক্টরি উল্লেখ করে দেখুন stackoverflow.com/questions/9591036/...
FelixJongleur42

12

এটি আপনার প্রয়োজনের জন্য পর্যাপ্ত ক্রস প্ল্যাটফর্ম হলে স্ট্যাট () ব্যবহার করুন। এটি যদিও সি ++ মানক নয়, তবে পসিক্স।

এমএস উইন্ডোজটিতে _ স্ট্যাট, _স্ট্যাট ,৪, _ স্টটি 64৪, _উস্ট্যাট, _উসট্যাট ,৪, _ ওস্টটি 64৪ রয়েছে।


4
<sys / types.h> এবং <sys / stat.h> দেখুন msdn.microsoft.com/en-us/library/14h5k7ff(VS.71).aspx
activout.se

4
ভাল ব্যবহার না করার জন্য ভাল উত্তর +1 , যেহেতু এটি একটি ওভারকিল, তবে এখানে যেটা সরবরাহ করা হয়েছে তা থেকে এটি লেখা তুচ্ছ ছিল না, তাই আমি কেবল একটি উত্তর পোস্ট করেছি। দয়া করে এটি পরীক্ষা করুন।
gsamaras

9

কীভাবে access?

#include <io.h>

if (_access(filename, 0) == -1)
{
    // File does not exist
}

আইও এইচ। স্ট্যান্ডার্ড না থাকলেও উইন্ডোজ এবং লিনাক্সে কি সাধারণভাবে উপলব্ধ?
c0m4

4
অ্যাক্সেস () হল পসিক্স ফাংশন যা লিনাক্সে <unistd.h> এর মাধ্যমে উপলভ্য।
অ্যালেক্স বি

9

good()স্ট্রিমটিতে ফাংশনটি ব্যবহার করে অন্য সম্ভাবনা রয়েছে :

#include <fstream>     
bool checkExistence(const char* filename)
{
     ifstream Infield(filename);
     return Infield.good();
}

7

আমি কোনও ফাইল বিদ্যমান কিনা তা জানার চেষ্টা করে পুনর্বিবেচনা করব। পরিবর্তে, আপনি এটি ব্যবহার করার ইচ্ছুক একই মোডে এটি (স্ট্যান্ডার্ড সি বা সি ++ এ) খোলার চেষ্টা করা উচিত। ফাইলটি বিদ্যমান রয়েছে, যদি এটির লেখার প্রয়োজন হয় না, তবে এটি ব্যবহারের প্রয়োজন হয় না তা জেনে আপনি কী ব্যবহার করবেন?


আপনি যদি একটি lsমত প্রোগ্রাম লিখছেন ? আমি অনুমান করছি যে এখানে মূল পোস্টারটি মোটেও ফাইলটি খুলতে চায় না। পোজিক্সের স্ট্যাট ফাংশনটি আপনাকে ফাইলের অনুমতিগুলি সম্পর্কে যদিও তথ্যের অনুমতি দেবে বলে মনে করা হচ্ছে, সুতরাং এটি সমস্যার সমাধান করবে।
মাইকেল

6

যদি আপনার সংকলক সি ++ 17 সমর্থন করে তবে আপনার বুস্টের প্রয়োজন নেই, আপনি কেবল ব্যবহার করতে পারেন std::filesystem::exists

#include <iostream> // only for std::cout
#include <filesystem>

if (!std::filesystem::exists("myfile.txt"))
{
    std::cout << "File not found!" << std::endl;
}

3

না প্রয়োজনীয় , যা একটি ওভারকিল হবে


স্ট্যাট () ব্যবহার করুন ( প্যাভোন দ্বারা উল্লিখিত যদিও ক্রস প্ল্যাটফর্ম নয়):

#include <sys/stat.h>
#include <iostream>

// true if file exists
bool fileExists(const std::string& file) {
    struct stat buf;
    return (stat(file.c_str(), &buf) == 0);
}

int main() {
    if(!fileExists("test.txt")) {
        std::cerr << "test.txt doesn't exist, exiting...\n";
        return -1;
    }
    return 0;
}

আউটপুট:

C02QT2UBFVH6-lm:~ gsamaras$ ls test.txt
ls: test.txt: No such file or directory
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
test.txt doesn't exist, exiting...

আর একটি সংস্করণ (এবং তা) এখানে পাওয়া যাবে


ডাউনভোটার নয়, তবে ক্রস প্ল্যাটফর্ম সমাধানের জন্য প্রশ্নটি জিজ্ঞাসা করেছে, এবং সমস্ত প্ল্যাটফর্মগুলিতে স্ট্যাট উপস্থিত নেই।
প্যাভন

0

আপনি যদি ইতিমধ্যে ইনপুট ফাইল স্ট্রিম শ্রেণি ( ifstream) ব্যবহার করে থাকেন তবে আপনি এর ফাংশনটি ব্যবহার করতে পারেন fail()

উদাহরণ:

ifstream myFile;

myFile.open("file.txt");

// Check for errors
if (myFile.fail()) {
    cerr << "Error: File could not be found";
    exit(1);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.