2011-08-03 16 views
19

मुझे file_exists() के साथ बहुत अजीब समस्या है। मैं इस फ़ंक्शन का उपयोग यह जांचने के लिए कर रहा हूं कि एक ही फ़ोल्डर में 2 अलग-अलग फ़ाइलें मौजूद हैं या नहीं। मैंने दोबारा जांच की है, वे दोनों मौजूद हैं।file_exists() झूठी रिटर्न देता है, लेकिन फ़ाइल मौजूद है

echo $relative . $url['path'] . '/' . $path['filename'] . '.jpg'; 
Result: ../../images/example/001-001.jpg 

echo $relative . $url['path'] . '/' . $path['filename'] . '.' . $path['extension']; 
Result: ../../images/example/001-001.PNG 

अब file_exists() इन पर का उपयोग करते हैं:

var_dump(file_exists($relative . $url['path'] . '/' . $path['filename'] . '.jpg')); 
Result: bool(false) 

var_dump(file_exists($relative . $url['path'] . '/' . $path['filename'] . '.' . $path['extension'])); 
Result: bool(true) 

मैं समझ नहीं है - इन फ़ाइलों की दोनों मौजूद नहीं है। मैं विंडोज चला रहा हूं, इसलिए यह केस-संवेदी समस्या से संबंधित नहीं है। सुरक्षित मोड बंद है।

उल्लेखनीय क्या हो सकता है कि यह है कि .png एक उपयोगकर्ता द्वारा एफ़टीपी के माध्यम से अपलोड किया जाता है, जबकि .jpg एक स्क्रिप्ट का उपयोग करके बनाया जाता है। लेकिन जहां तक ​​मुझे पता है, इससे कोई फर्क नहीं पड़ता है।

कोई सुझाव?

धन्यवाद

+4

एक शब्द: अनुमतियां। –

+0

मेरे लिए यह समाप्त हो गया क्योंकि इसे एक पूर्ण पथ की आवश्यकता है, न कि एक सापेक्ष पथ। कुछ PHP फ़ंक्शंस वर्तमान फ़ाइल से संबंधित पथ स्वीकार करते हैं, एक parse_ini_file है। –

उत्तर

14

file_exists() के परिणाम कैश किए गए हैं, इसलिए clearstatcache() का उपयोग करने का प्रयास करें। यदि इससे मदद नहीं मिली है, तो नाम दोबारा जांचें - वे समान हो सकते हैं, लेकिन समान नहीं हैं।

+0

यह वास्तव में समस्या थी। ऐसा लगता है कि लिपि ने _ के साथ बदल दिया है।याद करने के लिए बहुत मुश्किल (और कष्टप्रद): | – Bv202

+0

इसी तरह की चीजें कभी-कभी होती हैं :) – Timur

+3

मेरे लिए clearstatcache() - मदद नहीं की लेकिन ... मेरी कक्षा का नाम मल्टीमीडिया था। तब मैंने clearstatcache() का उपयोग किया - अभी भी काम नहीं किया। फिर मैंने फ़ाइल का नाम बदलकर मल्टीमीडिया 2 में मदद नहीं की। वह अजीब था। तब मैंने फ़ाइल को एबीसी में बदल दिया। यह काम किया ... फिर मल्टीमीडिया का नाम बदल गया और यह फिर से काम किया: डी मुझे लगभग आधे घंटे लगे ... – instead

10

यह सुरक्षित मोड की वजह से है। आप इसे बंद कर सकते हैं या निर्देशिका को safe_mode_include_dir में शामिल कर सकते हैं। या उन फ़ाइलों के लिए फ़ाइल स्वामित्व/अनुमतियां बदलें।

php.net: file_exists()
php.net: safe mode

+0

सुरक्षित मोड पहले ही बंद कर दिया गया है, इसलिए यह समस्या नहीं है। साथ ही, अनुमतियां फ़ाइल-विशिष्ट होनी चाहिए, क्योंकि वे दोनों एक ही फ़ोल्डर में हैं। मैंने विंडोज़ में इन मुद्दों को कभी नहीं देखा है, लेकिन अनुमतियों को देखते समय, मुझे दोनों के बीच कोई अंतर नहीं दिखता है ... – Bv202

+0

आह, क्षमा करें सुरक्षित मोड बंद नहीं हुआ है। यदि अनुमतियां समान हैं, तो आपको उन फ़ाइलों के लिए स्वामी आईडी या समूह आईडी की जांच करने की आवश्यकता हो सकती है, यह हो सकता है कि आपका वेबस्यूसर समूह से संबंधित न हो या फ़ाइल का स्वामी न हो। – ace

+0

ध्यान दें कि PHP 5.4.0 में सुरक्षित_मोड हटा दिया गया है। – Genjo

2

विभाजक के रूप में के बजाय '/' की DIRECTORY_SEPARATOR का उपयोग करें। विंडोज लिनक्स और यूनिक्स सिस्टम की तुलना में फ़ाइल सिस्टम पथ (बैकस्लैश) के लिए एक अलग विभाजक का उपयोग करता है।

+0

यह 'DIRECTORY_SEPARATOR' है? –

+0

हां, यह है, @ happy_marmoset। मैंने जवाब को सही किया। धन्यवाद! – Doug

+2

'/' विंडोज़ पर भी काम करता है – OverCoder

0

क्या आपने मैन्युअल प्रविष्टि की कोशिश की है। भी अपने दो एक्सटेंशन अलग मामले में होने लगते हैं

var_dump(file_exists('../../images/example/001-001.jpg')); 
    var_dump(file_exists('../../images/example/001-001.PNG')); 
7

बस मेरे $ .02: मैं सिर्फ इस समस्या थी और यह फ़ाइल नाम के अंत में एक अंतरिक्ष के कारण था। यह हमेशा एक पथ की समस्या नहीं है - हालांकि यह पहली चीज है जिसे मैं जांचता हूं - हमेशा। मैं फ़ाइल नाम को ls -l कमांड का उपयोग करके एक शेल विंडो में काट और पेस्ट कर सकता हूं और निश्चित रूप से फ़ाइल को रेखांकित करता है क्योंकि कमांड लाइन उस स्थान को अनदेखा कर देगी जहां file_exists नहीं है। यह वास्तव में निराशाजनक और लगभग असंभव है, यह स्टैक ओवरफ्लो के लिए नहीं था।

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

+1

बेशक मुझे यह जवाब मिल गया * बाद में * मैं इस सटीक मुद्दे को अपने आप हल करता हूं! –

+0

ट्रिम() का उपयोग करने के लिए सबसे अच्छा। मुझे हर बार मिलता है। – Ligemer

8

मैंने पाया है कि अगर एक फ़ाइल मौजूद है मुझे जांच करने के लिए के लिए (वर्तमान php फ़ाइल से क्रियान्वित किया जा रहा है के सापेक्ष) क्या काम करता है कोड के इस टुकड़े है:

$filename = 'myfile.jpg'; 
    $file_path_and_name = dirname(__FILE__) . DIRECTORY_SEPARATOR . "{$filename}"; 

     if (file_exists($file_path_and_name)){ 
     // file exists. Do some magic...    
     } else { 
      // file does not exists... 
     } 
+1

मैं इसे ठीक करने के लिए किसी समस्या में भाग गया, मैंने यह सुनिश्चित किया कि पथ '/' – Mohammad

0

एक custom_file_exists() फ़ंक्शन से प्रेरित @Timur, @Brian, @Doug और @Shahar पिछले जवाब:

function custom_file_exists($file_path=''){ 
    $file_exists=false; 

    //clear cached results 
    //clearstatcache(); 

    //trim path 
    $file_dir=trim(dirname($file_path)); 

    //normalize path separator 
    $file_dir=str_replace('/',DIRECTORY_SEPARATOR,$file_dir).DIRECTORY_SEPARATOR; 

    //trim file name 
    $file_name=trim(basename($file_path)); 

    //rebuild path 
    $file_path=$file_dir."{$file_name}"; 

    //If you simply want to check that some file (not directory) exists, 
    //and concerned about performance, try is_file() instead. 
    //It seems like is_file() is almost 2x faster when a file exists 
    //and about the same when it doesn't. 

    $file_exists=is_file($file_path); 

    //$file_exists=file_exists($file_path); 

    return $file_exists; 
} 
+0

से शुरू नहीं हुआ है, आप 'custom_basename' फ़ंक्शन घोषणा –

+0

गायब हैं धन्यवाद chumkiu basename() इस मामले में पर्याप्त होगा – RafaSashi

1

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

एक सत्र खोलने का प्रयास करें क्योंकि उपयोगकर्ता आपके वेबसर्वर और सीडी को चला रहा है। फ़ोल्डर को इस उपयोगकर्ता द्वारा सुलभ किया जाना चाहिए और फ़ाइल को पठनीय होना चाहिए।

यदि नहीं, तो PHP वापस आ जाएगा कि फ़ाइल मौजूद नहीं है।

1

यहां एक बहुत ही सरल चाल है जो मेरे लिए काम करती है।

जब मैं निम्नलिखित पंक्ति लिखता हूं, तो यह झूठी वापसी करता है।

if(file_exists('/my-dreams-files/'.$_GET['article'].'.html')) 

और जब मैं स्लैश शुरू करने वाले यूआरएल को हटाने के साथ लिखता हूं, तो यह सच हो जाता है। इसकी मेरे लिए काम कर रहा

if(file_exists('my-dreams-files/'.$_GET['article'].'.html')) 
+0

ऐसा लगता है कि ऐसा लगता है अपेक्षित, बशर्ते कि मेरी सपने-फाइल ड्राइव की जड़ में न हों।/इसके सामने कुछ भी जड़ नहीं है। आपका दूसरा उदाहरण सापेक्ष है। – conrad10781

0

इस उत्तर एक सा hacky सकता है, लेकिन हो सकता है -

$file = 'path/to/file.jpg'; 
$file = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].'/'.$file; 
$file_headers = @get_headers($file); 
if($file_headers[0] == 'HTTP/1.1 404 Not Found') { 
    $exists = false; 
}else{ 
    $exists = true; 
} 

जाहिरा तौर पर $_SERVER['REQUEST_SCHEME'] थोड़ा साथ उपयोग करने के लिए dicey IIS 7.0 + पीएचपी 5.3 तो आप शायद देख सकता है प्रोटोकॉल में जोड़ने के लिए एक बेहतर तरीका के लिए।

मैं यहाँ http://php.net/manual/en/function.file-exists.php#75064

3

file_exists() इस जवाब मिला सिर्फ HTTP पते के साथ काम नहीं करता।

यह केवल फाइल सिस्टम पथ (और, आप PHP5 उपयोग कर रहे हैं एफ़टीपी।) का समर्थन करता है

कृपया ध्यान दें:

काम किया:

if (file_exists($_SERVER['DOCUMENT_ROOT']."/folder/test.txt") 
    echo "file exists"; 

काम नहीं:

if (file_exists("www.mysite.com/folder/test.txt") 
    echo "file exists"; 
0

मैंने पिछले दो घंटों में सोचा कि मेरे अगर कथन के साथ क्या गलत था: file_exists ($ file) f वापस लौटा रहा था अन्यथा, हालांकि मैं बिना किसी समस्या के ($ फ़ाइल) को कॉल कर सकता हूं।

ऐसा लगता है कि मुझे नहीं पता था कि php include_path मूल्य मैं .htaccess फ़ाइल में निर्धारित किया था file_exists, is_file, आदि

इस प्रकार के बाद से जारी नहीं किया:

<?PHP 
// .htaccess php_value include_path '/home/user/public_html/'; 

// includes lies in /home/user/public_html/includes/ 

//doesn't work, file_exists returns false 
if (file_exists('includes/config.php')) 
{ 
    include('includes/config.php'); 
} 

//does work, file_exists returns true 
if (file_exists('/home/user/public_html/includes/config.php')) 
{ 
    include('includes/config.php'); 
} 
?> 

बस यह दिखाने के लिए चला जाता है कि "सादगी के लिए शॉर्टकट" .htaccess में include_path को सेट करने जैसे लंबे समय तक अधिक दुःख का कारण बन सकता है।

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