2011-03-14 10 views
17

PHP में, मैं कैसे जांच करूं कि स्ट्रीम संसाधन (या फ़ाइल पॉइंटर, हैंडल, या जो भी आप उन्हें कॉल करना चाहते हैं) या तो पठनीय या लिखने योग्य है? उदाहरण के लिए, यदि आपको ऐसी स्थिति का सामना करना पड़ रहा है जहां आप संसाधन खोले या बनाए गए तरीके के बारे में कुछ नहीं जानते हैं, तो आप यह कैसे जांच सकते हैं कि यह पठनीय है या नहीं? और आप कैसे लिखते हैं कि यह लिखने योग्य है या नहीं?कैसे जांचें कि कोई PHP स्ट्रीम संसाधन पठनीय या लिखने योग्य है या नहीं?

मैंने जो परीक्षण किया है उसके आधार पर (केवल PHP 5.3.3 का उपयोग करके नियमित पाठ फ़ाइलों के साथ), fread() संसाधन को पठनीय नहीं होने पर किसी भी स्तर पर किसी भी त्रुटि को फेंक नहीं देता है। यह सिर्फ एक खाली स्ट्रिंग देता है, लेकिन यह एक खाली फ़ाइल के लिए भी करता है। और आदर्श रूप में, यह जांच करना बेहतर होगा कि संसाधन को संशोधित न करें। परीक्षण करना यदि कोई संसाधन इसे पढ़ने की कोशिश करके पठनीय है तो पॉइंटर की स्थिति बदल देगा।

इसके विपरीत, fwrite() संसाधन लिखने योग्य नहीं होने पर किसी भी स्तर पर किसी भी त्रुटि को फेंक नहीं देता है। यह सिर्फ शून्य देता है। यह थोड़ा और उपयोगी है, क्योंकि यदि आप फ़ाइल में बाइट्स की एक निश्चित संख्या लिखने की कोशिश कर रहे थे और fwrite() शून्य लौटाता है, तो आप जानते हैं कि कुछ गलत हो गया है। लेकिन फिर भी, यह एक आदर्श तरीका नहीं है, क्योंकि यह जानना बहुत बेहतर होगा कि इससे लिखने की कोशिश करने से पहले लिखने की आवश्यकता है या नहीं और यह देखने में विफल रहता है कि यह विफल हो गया है या नहीं।

इसके अलावा, आदर्श रूप से, जांच किसी भी प्रकार के स्ट्रीम संसाधन पर काम नहीं करनी चाहिए, न केवल फाइलें।

क्या यह संभव है? क्या ऐसा कुछ भी मौजूद है? मैं कुछ उपयोगी खोजने में असमर्थ रहा हूं। आपके जवाब के लिए पहले से ही धन्यवाद।

+0

, दोनों [ ' फ्रेड() '] (http://php.net/fread) और [' fwrite() '] (http://php.net/fwrite) अपने संबंधित दस्तावेज पृष्ठ के अनुसार विफलता पर 'बूल (झूठी)' वापसी .... लेकिन यह PHP 5.3.5 में नहीं होता है। –

उत्तर

24

काफी सरल की तरह है कि पूर्णांक में परिवर्तित करने का जादू है। बस अपने स्क्रिप्ट से stream_get_meta_data($resource) कहते हैं, तो वापसी मान के mode सरणी तत्व की जाँच करें:

$f = fopen($file, 'r'); 
$meta = stream_get_meta_data($f); 
var_dump($meta['mode']); // r 

और तुम्हें पता करना चाहते हैं, तो अंतर्निहित डेटा लिखने योग्य है:

var_dump(is_writable($meta['uri'])); // true if the file/uri is writable 
बेशक
+1

'स्ट्रीम फॉपेन(), fsockopen() और pfsockopen() द्वारा बनाई गई कोई भी स्ट्रीम हो सकती है। 'Fwrite के साथ खोले गए किसी भी फाइल पर काम नहीं करता है? fread? कुछ मामलों में मेरे समाधान से बेहतर, दूसरों में बहुत अधिक बदतर ... ** संपादित करें ** फॉपेन द्वारा खोले गए हैंडल का उपयोग कभी भी दिमाग, फ्रेड और फ़्राइट करें। मैं बेवकूफ़ हूँ। – rockerest

+1

@rock: आप 'fwrite' या' fread' वाली फ़ाइल नहीं खोल सकते हैं। वे कार्य केवल खुली धाराओं पर काम करते हैं। यह फ़ंक्शन PHP में सभी स्ट्रीम संसाधनों पर काम करेगा। तो मैं यह देखने में असफल रहा कि यह कभी भी * कितना बुरा हो सकता है *। वास्तव में, यह 100% प्लेटफ़ॉर्म स्वतंत्र है और स्ट्रीम रैपर के साथ भी काम करेगा। तो यह वास्तव में सही समाधान है ... – ircmaxell

+0

मुझे लगता है कि मुझे यह पसंद है। क्या आपको पता है कि मैन्युअल में ['fopen() 'पृष्ठ पर मोड की तालिका] (http://www.php.net/manual/en/function.fopen.php) पूरी तरह से संपूर्ण सूची है? – jnrbsn

1

ठीक है, तो यह सबसे अच्छा समाधान नहीं हो सकता है, लेकिन मुझे लगता है कि यह पर्याप्त है, यह देखते हुए कि PHP में कुछ भी स्वचालित रूप से ऐसा करने के लिए कुछ भी नहीं है।

पहला कदम के लिए, आप फ़ाइल से संसाधन की inode मिल जाएगा, और फिर फ़ाइल नाम पढ़ें:

$stat = fstat($fp); 
$inode = $stat['ino']; 
system("find -inum $inode", $result); 

this question about finding the filename from a filehandle से सीधे लिया।

अब आपके पास फ़ाइल नाम है ($result में) आप अनुमति प्राप्त करने के लिए fileperms($result) कर सकते हैं।

ध्यान दें कि fileperms() एक int देता है, और प्रलेखन जादू 0 (वास्तव में केवल एक ऑक्टल के रूप में int का इलाज करता है) को अग्रणी 0 (उदा। 0755) बनाए रखने के लिए करता है।

भी ध्यान रखें कि प्रलेखन एक अच्छा स्ट्रिंग में -rw-r--r--

+0

संसाधन मानना ​​एक फ़ाइल है जिसके साथ शुरुआत है। एक सॉकेट हो सकता है, या 'php: // stdin'। –

+0

... और सिस्टम * निक्स है। यह किसी भी माध्यम से सही नहीं है, लेकिन मैं _think_ यह सबसे अच्छा PHP कर सकता है? – rockerest

+0

यह भी संभव है कि फ़ाइल लिखने योग्य हो, लेकिन फ़ाइलहेडल केवल पढ़ने के लिए खुला है।हालांकि यह बहुत चालाक है। – Charles

संबंधित मुद्दे