खोज…


वाक्य - विन्यास

  • int readfile (स्ट्रिंग $ फ़ाइल नाम [, बूल $ का उपयोग करें_संकल्प_पथ = गलत [, संसाधन $]])

पैरामीटर

पैरामीटर विवरण
फ़ाइल का नाम फ़ाइल नाम पढ़ा जा रहा है।
use_include_path आप वैकल्पिक दूसरे पैरामीटर का उपयोग कर सकते हैं और इसे TRUE पर सेट कर सकते हैं, यदि आप भी file_path में फ़ाइल की खोज करना चाहते हैं, तो।
प्रसंग एक संदर्भ धारा संसाधन।

टिप्पणियों

फ़ाइल नाम सिंटैक्स

इस विषय में किए गए अधिकांश फ़ाइलनाम हैं:

  1. प्रकृति में तार।
    • फ़ाइल नाम सीधे पारित किया जा सकता है। यदि अन्य प्रकार के मान पारित किए जाते हैं, तो उन्हें स्ट्रिंग के लिए रखा जाता है। यह विशेष रूप से SplFileInfo साथ उपयोगी है, जो DirectoryIterator की पुनरावृत्ति में मूल्य है।
  2. सापेक्ष या निरपेक्ष।
    • वे निरपेक्ष हो सकते हैं। यूनिक्स जैसी प्रणालियों पर, निरपेक्ष पथ / साथ शुरू होते हैं, जैसे /home/user/file.txt , जबकि Windows पर, पूर्ण पथ ड्राइव से शुरू होते हैं, जैसे C:/Users/user/file.txt
    • वे सापेक्ष भी हो सकते हैं, जो कि getcwd के मूल्य पर निर्भर है और chdir द्वारा परिवर्तन के अधीन है।
  3. प्रोटोकॉल स्वीकार करें।
    • वे scheme:// साथ शुरू कर सकते हैं scheme:// प्रबंधन करने के लिए प्रोटोकॉल आवरण को निर्दिष्ट करने के लिए। उदाहरण के लिए, file_get_contents("http://example.com") http://example.com से सामग्री प्राप्त करता है।
  4. स्लैश-संगत।
    • जबकि DIRECTORY_SEPARATOR विंडोज पर एक बैकस्लैश है, और डिफ़ॉल्ट रूप से पथ के लिए प्रणाली रिटर्न बैकस्लैश, डेवलपर अभी भी उपयोग कर सकते हैं / निर्देशिका विभाजक के रूप में। इसलिए, संगतता के लिए, डेवलपर्स सभी सिस्टम पर निर्देशिका विभाजकों के रूप में / उपयोग कर सकते हैं, लेकिन ध्यान रखें कि फ़ंक्शन (जैसे realpath ) द्वारा लौटाए गए मूल्यों में बैकस्लैश हो सकते हैं।

फ़ाइलों और निर्देशिकाओं को हटाना

फ़ाइलों को हटाना

unlink फ़ंक्शन एकल फ़ाइल को हटा देता है और लौटाता है कि क्या ऑपरेशन सफल था।

$filename = '/path/to/file.txt';

if (file_exists($filename)) {
    $success = unlink($filename);
    
    if (!$success) {
         throw new Exception("Cannot delete $filename");
    }
}

पुनरावर्ती विलोपन के साथ निर्देशिकाओं को हटाना

दूसरी ओर, निर्देशिका rmdir साथ हटा दी जानी चाहिए। हालाँकि, यह फ़ंक्शन केवल खाली निर्देशिका हटाता है। फ़ाइलों के साथ एक निर्देशिका को हटाने के लिए, पहले निर्देशिकाओं में फ़ाइलों को हटा दें। यदि निर्देशिका में उपनिर्देशिकाएँ हैं, तो पुनरावर्तन की आवश्यकता हो सकती है।

निम्न उदाहरण किसी निर्देशिका में फ़ाइलों को स्कैन करता है, सदस्य फ़ाइलों / निर्देशिकाओं को पुनरावर्ती रूप से हटाता है, और हटाई गई फ़ाइलों की संख्या (निर्देशिकाओं को नहीं) लौटाता है।

function recurse_delete_dir(string $dir) : int {
    $count = 0;

    // ensure that $dir ends with a slash so that we can concatenate it with the filenames directly
    $dir = rtrim($dir, "/\\") . "/";

    // use dir() to list files
    $list = dir($dir);

    // store the next file name to $file. if $file is false, that's all -- end the loop.
    while(($file = $list->read()) !== false) {
        if($file === "." || $file === "..") continue;
        if(is_file($dir . $file)) {
            unlink($dir . $file);
            $count++;
        } elseif(is_dir($dir . $file)) {
            $count += recurse_delete_dir($dir . $file);
        }
    }

    // finally, safe to delete directory!
    rmdir($dir);

    return $count;
}

सुविधा कार्य

कच्चा प्रत्यक्ष आई.ओ.

file_get_contents और file_put_contents एक कॉल में पीएचपी स्ट्रिंग से / से एक फ़ाइल में / से पढ़ने / लिखने की क्षमता प्रदान करते हैं।

file_put_contents उपयोग FILE_APPEND और अधिलेखित करने के बजाय फ़ाइल को जोड़ने के लिए FILE_APPEND बिटमास्क ध्वज के साथ भी किया जा सकता है। यह लेखन के लिए आगे बढ़ते हुए फ़ाइल के लिए एक विशेष लॉक प्राप्त करने के लिए LOCK_EX बिटमास्क के साथ उपयोग किया जा सकता है। Bitmask झंडे के साथ शामिल हो सकते हैं | बिटवाइज- OR ऑपरेटर।

$path = "file.txt";
// reads contents in file.txt to $contents
$contents = file_get_contents($path);
// let's change something... for example, convert the CRLF to LF!
$contents = str_replace("\r\n", "\n", $contents);
// now write it back to file.txt, replacing the original contents
file_put_contents($path, $contents);

FILE_APPEND फ़ाइलें लॉग इन करने की, जबकि जोड़कर के लिए आसान है LOCK_EX में मदद करता है कई प्रक्रियाओं से फ़ाइल लेखन की रेस स्थिति को रोकने के। उदाहरण के लिए, वर्तमान सत्र के बारे में एक लॉग फ़ाइल में लिखने के लिए:

file_put_contents("logins.log", "{$_SESSION["username"]} logged in", FILE_APPEND | LOCK_EX);

सीएसवी आईओ

fgetcsv($file, $length, $separator)

सीएसवी क्षेत्रों के लिए ओपन फाइल चेकिंग से fgetcsv पार्स लाइन। यह सफलता पर एक सरणी में CSV फ़ील्ड देता है या विफलता पर FALSE

डिफ़ॉल्ट रूप से, यह CSV फ़ाइल की केवल एक पंक्ति पढ़ेगा।

$file = fopen("contacts.csv","r");
print_r(fgetcsv($file));    
print_r(fgetcsv($file,5," "));
fclose($file); 

contacts.csv

Kai Jim, Refsnes, Stavanger, Norway
Hege, Refsnes, Stavanger, Norway

आउटपुट:

Array
(
    [0] => Kai Jim
    [1] => Refsnes
    [2] => Stavanger
    [3] => Norway
)
Array
(
    [0] => Hege,
)

सीधे stdout करने के लिए एक फ़ाइल पढ़ना

readfile एक फाइल को आउटपुट बफर में कॉपी करता है। readfile () बड़ी मेमोरी भेजने पर भी, अपने आप कोई मेमोरी इश्यू नहीं पेश करेगा।

$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}

या फाइल पॉइंटर से

वैकल्पिक रूप से, फ़ाइल में एक बिंदु की तलाश के लिए fpassthru प्रतिलिपि बनाना शुरू करें, इसके बजाय fpassthru उपयोग करें। निम्नलिखित उदाहरण में, अंतिम 1024 बाइट्स को stdout में कॉपी किया जाता है:

$fh = fopen("file.txt", "rb");
fseek($fh, -1024, SEEK_END); 
fpassthru($fh);

फ़ाइल को किसी सरणी में पढ़ना

file एक सरणी में पारित फ़ाइल में लाइनों को वापस करती है। सरणी का प्रत्येक तत्व फ़ाइल में एक पंक्ति से मेल खाता है, जिसमें नई लाइन अभी भी जुड़ी हुई है।

print_r(file("test.txt"));

test.txt

Welcome to File handling
This is to test file handling

आउटपुट:

Array 
( 
    [0] => Welcome to File handling 
    [1] => This is to test file handling 
)

फ़ाइल जानकारी प्राप्त करना

जाँचें कि क्या कोई पथ निर्देशिका या फ़ाइल है

is_dir फ़ंक्शन लौटाता है कि क्या तर्क एक निर्देशिका है, जबकि is_file देता है कि क्या तर्क एक फ़ाइल है। यह जाँचने के लिए file_exists का उपयोग करें कि क्या यह या तो है।

$dir  = "/this/is/a/directory";
$file = "/this/is/a/file.txt";

echo is_dir($dir) ? "$dir is a directory" : "$dir is not a directory", PHP_EOL,
    is_file($dir) ? "$dir is a file" : "$dir is not a file", PHP_EOL,
    file_exists($dir) ? "$dir exists" : "$dir doesn't exist", PHP_EOL,
    is_dir($file) ? "$file is a directory" : "$file is not a directory", PHP_EOL,
    is_file($file) ? "$file is a file" : "$file is not a file", PHP_EOL,
    file_exists($file) ? "$file exists" : "$file doesn't exist", PHP_EOL;

यह देता है:

/this/is/a/directory is a directory
/this/is/a/directory is not a file
/this/is/a/directory exists
/this/is/a/file.txt is not a directory
/this/is/a/file.txt is a file
/this/is/a/file.txt exists

फ़ाइल प्रकार की जाँच करना

filetype के प्रकार की जाँच करने के लिए filetype का उपयोग करें, जो हो सकता है:

  • fifo
  • char
  • dir
  • block
  • link
  • file
  • socket
  • unknown

फ़ाइल नाम को सीधे filetype :

echo filetype("~"); // dir

यदि फ़ाइल मौजूद नहीं है, तो नोट करें कि filetype गलत है और E_WARNING ट्रिगर करता है।

पठनीयता और लेखन क्षमता की जाँच करना

फ़ाइल नाम is_writable और is_readable फ़ंक्शंस को पास करना यह is_writable कि फ़ाइल क्रमशः लेखन योग्य या पठनीय है या नहीं।

यदि फ़ाइल मौजूद नहीं है, तो फ़ंक्शन कृपापूर्वक false तरीके से वापस आ जाते हैं।

फ़ाइल एक्सेस की जाँच करना / समय बदलना

का उपयोग करते हुए filemtime और fileatime रिटर्न अंतिम संशोधन या फ़ाइल का एक्सेस का टाइमस्टैम्प। वापसी मूल्य एक यूनिक्स टाइमस्टैम्प है - विवरण के लिए तिथियां और समय के साथ काम करना देखें।

echo "File was last modified on " . date("Y-m-d", filemtime("file.txt"));
echo "File was last accessed on " . date("Y-m-d", fileatime("file.txt"));

Fileinfo के साथ पाथ पार्ट्स प्राप्त करें

$fileToAnalyze = ('/var/www/image.png');

$filePathParts = pathinfo($fileToAnalyze);

echo '<pre>';
   print_r($filePathParts);
echo '</pre>';

यह उदाहरण आउटपुट करेगा:

Array
(
    [dirname] => /var/www
    [basename] => image.png
    [extension] => png
    [filename] => image
)

जिसका उपयोग निम्नानुसार किया जा सकता है:

$filePathParts['dirname']
$filePathParts['basename']
$filePathParts['extension']
$filePathParts['filename']
पैरामीटर विवरण
$ पथ फ़ाइल का पूर्ण पथ पार्स किया जाना है
$ विकल्प चार उपलब्ध विकल्पों में से एक [PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION या PATHINFO_FILENAME]
  • यदि कोई विकल्प (दूसरा पैरामीटर) पारित नहीं होता है, तो एक साहचर्य सरणी वापस आ जाती है अन्यथा एक स्ट्रिंग लौटा दी जाती है।
  • मान्य नहीं है कि फ़ाइल मौजूद है।
  • बस स्ट्रिंग को भागों में पार्स करता है। फ़ाइल पर कोई सत्यापन नहीं किया गया है (कोई माइम-प्रकार की जाँच नहीं है, आदि)
  • विस्तार केवल $path का अंतिम विस्तार है फ़ाइल image.jpg.png लिए $pathimage.jpg.png होगा .png भले ही यह तकनीकी रूप से .jpg फ़ाइल हो। एक्सटेंशन के बिना एक फ़ाइल सरणी में एक्सटेंशन तत्व नहीं लौटाएगी।

बड़ी फ़ाइलों के साथ काम करते समय मेमोरी का उपयोग कम से कम करें

अगर हमें एक बड़ी फाइल को पार्स करने की आवश्यकता है, जैसे कि एक CSV में 10 से अधिक Mbytes हैं जिसमें लाखों पंक्तियाँ हैं, कुछ file या file_get_contents फ़ंक्शन का उपयोग करते हैं और साथ में memory_limit सेटिंग मारते हैं।

XXXXX बाइट्स की अनुमत स्मृति आकार समाप्त हो गया है

त्रुटि। निम्नलिखित स्रोत पर विचार करें (शीर्ष -1m.csv की बिल्कुल 1 मिलियन पंक्तियाँ हैं और यह लगभग 22 Mbytes आकार का है)

var_dump(memory_get_usage(true));
$arr = file('top-1m.csv');
var_dump(memory_get_usage(true));

यह आउटपुट:

int(262144)
int(210501632) 

क्योंकि दुभाषिया को $arr सरणी में सभी पंक्तियों को रखने की आवश्यकता थी, इसलिए इसने ~ 200 Mbytes RAM का उपभोग किया। ध्यान दें कि हमने ऐरे की सामग्री के साथ भी कुछ नहीं किया है।

अब निम्नलिखित कोड पर विचार करें:

var_dump(memory_get_usage(true));
$index = 1;
if (($handle = fopen("top-1m.csv", "r")) !== FALSE) {
    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
        file_put_contents('top-1m-reversed.csv',$index . ',' . strrev($row[1]) . PHP_EOL, FILE_APPEND);
        $index++;
    }
    fclose($handle);
}
var_dump(memory_get_usage(true));

जो आउटपुट देता है

int(262144)
int(262144)

इसलिए हम मेमोरी के एक अतिरिक्त बाइट का उपयोग नहीं करते हैं, लेकिन पूरे CSV को पार्स करते हैं और इसे दूसरे कॉलम में सेव करते हैं, जो दूसरे कॉलम के मान को उलट देता है। ऐसा इसलिए है क्योंकि fgetcsv केवल एक पंक्ति पढ़ता है और प्रत्येक $row में $row अधिलेखित है।

स्ट्रीम-आधारित फ़ाइल IO

एक स्ट्रीम खोलना

fopen एक फ़ाइल स्ट्रीम हैंडल खोलता है, जिसका उपयोग इसके ऊपर पढ़ने, लिखने, मांगने और अन्य कार्यों के लिए विभिन्न कार्यों के साथ किया जा सकता है। यह मान resource प्रकार का है, और इसकी कार्यक्षमता को बनाए रखने वाले अन्य थ्रेड्स को पारित नहीं किया जा सकता है।

$f = fopen("errors.log", "a"); // Will try to open errors.log for writing

दूसरा पैरामीटर फ़ाइल स्ट्रीम का मोड है:

मोड विवरण
r फ़ाइल की शुरुआत में केवल रीड मोड में खोलें
r+ फ़ाइल की शुरुआत में पढ़ना और लिखना शुरू करें
w केवल लेखन के लिए खुला, फ़ाइल की शुरुआत में। यदि फ़ाइल मौजूद है तो यह फ़ाइल को खाली कर देगी। यदि यह मौजूद नहीं है तो यह इसे बनाने का प्रयास करेगा।
w+ फ़ाइल की शुरुआत में पढ़ना और लिखना शुरू करना। यदि फ़ाइल मौजूद है तो यह फ़ाइल को खाली कर देगी। यदि यह मौजूद नहीं है तो यह इसे बनाने का प्रयास करेगा।
a केवल लिखने के लिए एक फ़ाइल खोलें, फ़ाइल के अंत में शुरू करें। यदि फ़ाइल मौजूद नहीं है, तो इसे बनाने का प्रयास किया जाएगा
a+ पढ़ने और लिखने के लिए एक फ़ाइल खोलें, फ़ाइल के अंत में शुरू करें। यदि फ़ाइल मौजूद नहीं है, तो इसे बनाने का प्रयास किया जाएगा
x केवल लिखने के लिए एक फ़ाइल बनाएं और खोलें। यदि फ़ाइल मौजूद है तो fopen कॉल विफल हो जाएगी
x+ पढ़ने और लिखने के लिए एक फ़ाइल बनाएं और खोलें। यदि फ़ाइल मौजूद है तो fopen कॉल विफल हो जाएगी
c केवल लिखने के लिए फ़ाइल खोलें। यदि फ़ाइल मौजूद नहीं है, तो इसे बनाने का प्रयास किया जाएगा। यह फ़ाइल की शुरुआत में लिखना शुरू कर देगा, लेकिन लिखने के आगे फ़ाइल को खाली नहीं करेगा
c+ पढ़ने और लिखने के लिए फ़ाइल खोलें। यदि फ़ाइल मौजूद नहीं है, तो इसे बनाने का प्रयास किया जाएगा। यह फ़ाइल की शुरुआत में लिखना शुरू कर देगा, लेकिन लिखने के आगे फ़ाइल को खाली नहीं करेगा

विंडोज में मोड (जैसे a+b , wt , इत्यादि) के पीछे एक t जोड़ने से फाइल के साथ काम करते समय "\n" लाइन एंडिंग्स का अनुवाद "\r\n" हो जाएगा। मोड के पीछे b जोड़ें अगर यह इरादा नहीं है, खासकर अगर यह एक बाइनरी फ़ाइल है।

PHP एप्लिकेशन को fclose का उपयोग करके धाराओं को बंद करना चाहिए जब वे Too many open files त्रुटि को रोकने के लिए उपयोग नहीं किए जाते हैं। इसका मतलब है कि वेब सर्वर में, यह आवश्यक नहीं हो सकता (लेकिन अभी भी ऐसा करना चाहिए, एक अभ्यास संसाधन रिसाव को रोकने के लिए के रूप में) धाराओं बंद करने के लिए - यह CLI कार्यक्रमों में विशेष रूप से महत्वपूर्ण है जब नीचे क्रम बन्द हो जाता है, क्योंकि धाराओं केवल बंद हो जाती हैं यदि आप प्रक्रिया को लंबे समय तक चलने की उम्मीद नहीं करते हैं, और कई धाराएं नहीं खोलेंगे।

पढ़ना

fread का उपयोग करके फ़ाइल पॉइंटर से दिए गए बाइट्स की संख्या या जब तक EOF पूरा नहीं होता है, पढ़ेंगे।

पठन रेखाएँ

fgets तक पहुंचने तक, या दिए गए लंबाई को पढ़ने के लिए fgets का fgets करके फ़ाइल को पढ़ा जाएगा।

पढ़ते समय fread और fgets दोनों फ़ाइल पॉइंटर को स्थानांतरित करेंगे।

शेष सब कुछ पढ़ना

stream_get_contents का उपयोग करके स्ट्रीम में सभी बाइट्स को एक स्ट्रिंग में छोड़ दिया जाएगा और इसे वापस कर दिया जाएगा।

फ़ाइल पॉइंटर स्थिति को समायोजित करना

शुरू में धारा खोलने के बाद, फ़ाइल सूचक फ़ाइल की शुरुआत में (या अंत, जब मोड है a प्रयोग किया जाता है)। fseek का उपयोग करके फ़ाइल पॉइंटर को एक नई स्थिति में ले जाएगा, तीन मानों में से एक के सापेक्ष:

  • SEEK_SET : यह डिफ़ॉल्ट मान है; फ़ाइल की स्थिति ऑफसेट फ़ाइल की शुरुआत के सापेक्ष होगी।
  • SEEK_CUR : फ़ाइल स्थिति ऑफ़सेट वर्तमान स्थिति के सापेक्ष होगी।
  • SEEK_END : फ़ाइल स्थिति ऑफ़सेट फ़ाइल के अंत के सापेक्ष होगी। एक नकारात्मक ऑफसेट पास करना इस मूल्य के लिए सबसे आम उपयोग है; यह फ़ाइल की स्थिति को फ़ाइल के अंत से पहले बाइट की निर्दिष्ट संख्या में ले जाएगा।

rewind , fseek($fh, 0, SEEK_SET) सुविधा शॉर्टकट है।

ftell का उपयोग करने से फ़ाइल पॉइंटर की पूर्ण स्थिति दिखाई देगी।

उदाहरण के लिए, निम्न स्क्रिप्ट पहले 10 बाइट्स को पढ़ती है, अगले 10 बाइट्स को पढ़ती है, 10 बाइट्स को छोड़ती है, अगले 10 बाइट्स को पढ़ती है, और फिर फाइल में अंतिम 10 बाइट्स।

$fh = fopen("file.txt", "rb");
fseek($fh, 10); // start at offset 10
echo fread($fh, 10); // reads 10 bytes
fseek($fh, 10, SEEK_CUR); // skip 10 bytes
echo fread($fh, 10); // read 10 bytes
fseek($fh, -10, SEEK_END); // skip to 10 bytes before EOF
echo fread($fh, 10); // read 10 bytes
fclose($fh);

लिख रहे हैं

fwrite का उपयोग करके वर्तमान फ़ाइल पॉइंटर पर शुरू होने वाली फ़ाइल को प्रदान की गई स्ट्रिंग लिखती है।

fwrite($fh, "Some text here\n");

फ़ाइलों और निर्देशिकाओं को ले जाना और कॉपी करना

फ़ाइलों की प्रतिलिपि बनाना

दूसरे तर्क में गंतव्य के लिए पहले तर्क में स्रोत फ़ाइल की copy बनाता है। निर्धारित गंतव्य को पहले से बनाई गई निर्देशिका में होना चाहिए।

if (copy('test.txt', 'dest.txt')) {
    echo 'File has been copied successfully';
} else {
    echo 'Failed to copy file to destination given.'
}

निर्देशिकाओं की प्रतिलिपि बनाना, पुनरावृत्ति के साथ

निर्देशिकाओं को कॉपी करना बहुत हद तक निर्देशिकाओं को हटाने के समान है, सिवाय इसके कि फ़ाइलों के लिए unlink बजाय copy का उपयोग किया जाता है, जबकि निर्देशिकाओं के लिए, rmdir बजाय mkdir का उपयोग किया जाता है, फ़ंक्शन के अंत में होने के बजाय शुरुआत में।

function recurse_delete_dir(string $src, string $dest) : int {
    $count = 0;

    // ensure that $src and $dest end with a slash so that we can concatenate it with the filenames directly
    $src = rtrim($dest, "/\\") . "/";
    $dest = rtrim($dest, "/\\") . "/";

    // use dir() to list files
    $list = dir($src);

    // create $dest if it does not already exist
    @mkdir($dest);

    // store the next file name to $file. if $file is false, that's all -- end the loop.
    while(($file = $list->read()) !== false) {
        if($file === "." || $file === "..") continue;
        if(is_file($src . $file)) {
            copy($src . $file, $dest . $file);
            $count++;
        } elseif(is_dir($src . $file)) {
            $count += recurse_copy_dir($src . $file, $dest . $file);
        }
    }

    return $count;
}

नाम बदल रहा है / चलती

फ़ाइलों और निर्देशिकाओं का नाम बदलना / बढ़ना बहुत सरल है। पूरे निर्देशिका ले जाया गया या एक कॉल में नाम बदला, का उपयोग कर किया जा सकता है rename समारोह।

  • rename("~/file.txt", "~/file.html");

  • rename("~/dir", "~/old_dir");

  • rename("~/dir/file.txt", "~/dir2/file.txt");



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow