जब आप PHP copy फ़ंक्शन का उपयोग करते हैं, तो ऑपरेशन गंतव्य फ़ाइल पर अंधाधुंध प्रतिलिपि बनाता है, भले ही यह पहले से मौजूद हो। आप फ़ाइल को सुरक्षित रूप से कैसे प्रतिलिपि बनाते हैं, अगर कोई मौजूदा फ़ाइल नहीं है तो केवल प्रतिलिपि बना रही है?आप किसी मौजूदा फ़ाइल को ओवरराइट किए बिना PHP में फ़ाइल कैसे कॉपी करते हैं?
उत्तर
स्पष्ट समाधान यह देखने के लिए file_exists पर कॉल करना होगा कि यह देखने के लिए कि फ़ाइल मौजूद है या नहीं, लेकिन ऐसा करने से दौड़ की स्थिति हो सकती है। हमेशा संभावना है कि जब आप file_exists पर कॉल करते हैं और जब आप copy पर कॉल करते हैं तो दूसरी फ़ाइल बनाई जाएगी। फ़ाइल मौजूद है या नहीं, यह जांचने का एकमात्र सुरक्षित तरीका fopen का उपयोग करना है।
जब आप fopen पर कॉल करते हैं, तो मोड को 'x' पर सेट करें। फ़ाइल बनाने के लिए यह fopen बताता है, लेकिन केवल तभी होता है जब यह अस्तित्व में न हो। यदि यह मौजूद है, fopen विफल हो जाएगा, और आपको पता चलेगा कि आप फ़ाइल नहीं बना सके। यदि यह सफल होता है, तो आपके पास गंतव्य पर एक फ़ाइल बनाई जाएगी जिसे आप सुरक्षित रूप से कॉपी कर सकते हैं। नमूना कोड के नीचे है: link()
समारोह का उपयोग कर
// The PHP copy function blindly copies over existing files. We don't wish
// this to happen, so we have to perform the copy a bit differently. The
// only safe way to ensure we don't overwrite an existing file is to call
// fopen in create-only mode (mode 'x'). If it succeeds, the file did not
// exist before, and we've successfully created it, meaning we own the
// file. After that, we can safely copy over our own file.
$filename = 'sourcefile.txt'
$copyname = 'sourcefile_copy.txt'
if ($file = @fopen($copyname, 'x')) {
// We've successfully created a file, so it's ours. We'll close
// our handle.
if ([email protected]($file)) {
// There was some problem with our file handle.
return false;
}
// Now we copy over the file we created.
if ([email protected]($filename, $copyname)) {
// The copy failed, even though we own the file, so we'll clean
// up by itrying to remove the file and report failure.
unlink($copyname);
return false;
}
return true;
}
मुझे लगता है कि आपने अपने प्रश्न का उत्तर दिया है - यह सुनिश्चित करने के लिए जांचें कि कॉपी करने से पहले गंतव्य फ़ाइल मौजूद है। अगर फ़ाइल मौजूद है, तो प्रतिलिपि छोड़ दें।
अद्यतन: मुझे लगता है कि आपने वास्तव में अपने स्वयं के प्रश्न का उत्तर दिया है। आप दौड़ की स्थिति का उल्लेख है, लेकिन लगता है फ़ाइल पहले से मौजूद है, तो आप कैसे जानते हैं कि है कि यदि आप कार्य करें:
- फ़ाइल पहले से ही है कि वास्तव में एक आप को कॉपी
- अन्य प्रक्रिया की प्रतिलिपि बनाना चाहते है वहाँ फ़ाइल अपना काम (फ़ाइल डेटा सब वहाँ है) पूरा कर लिया है
- अन्य प्रक्रिया नकल फ़ाइल विफल (और एक अधूरी फ़ाइल छोड़ देते हैं, या हटाना नई फ़ाइल)
मैं आपको लगता है नहीं जा रहा है अपनी समस्या का समाधान तैयार करते समय इन सवालों पर विचार करना चाहिए।
कोशिश copy()
के बजाय।
function safe_copy($src, $dest) {
if (link($src, $dest)) {
// Link succeeded, remove old name
unlink($filename);
return true;
} else {
// Link failed; filesystem has not been altered
return false;
}
}
दुर्भाग्य से, इस विंडोज पर नहीं कार्य नहीं करेगा।
एक शहद बैजर फ़ंक्शन, जो केवल दौड़-परिस्थितियों की परवाह नहीं करता है, लेकिन क्रॉस-प्लेटफ़ॉर्म काम करता है।
function safeCopy($src, $dest) {
if (is_file($dest) === true) {
// if the destination file already exists, it will NOT be overwritten.
return false;
}
if (copy($src, $dest) === false) {
echo "Failed to copy $src... Permissions correct?\n";
return false;
}
return true;
}
- 1. मैं किसी मौजूदा फ़ाइल को ओवरराइट किए बिना पायथन में फ़ाइल कैसे बना सकता हूं
- 2. मौजूदा परिवर्तनों को ओवरराइट किए बिना किसी फ़ाइल को पिछले संस्करण में कैसे वापस लाया जाए?
- 3. सी किसी भी मौजूदा सामग्री को ओवरराइट किए बिना बाइनरी फ़ाइल के बीच में लिखें
- 4. आप एक्सकोड में फ़ाइल को डुप्लिकेट कैसे करते हैं?
- 5. मौजूदा कोड को ओवरराइट किए बिना रिशेर्पर पूरा करना
- 6. चेकआउट किए बिना एसवीएन फ़ाइल को कैसे अपडेट करें?
- 7. जीआईटी: वर्तमान में ओवरराइट किए बिना पिछली प्रतिबद्धता से फ़ाइल को कैसे चेकआउट करें?
- 8. किसी मौजूदा फ़ाइल
- 9. वेब सेवा के उपयोग से आप फ़ाइल को SharePoint में कैसे कॉपी करते हैं?
- 10. आप फ़ाइल आकार को सी # में कैसे प्राप्त करते हैं?
- 11. आप पाइथन में फ़ाइल प्रकार को कैसे उपclass करते हैं?
- 12. कॉपी और मूल फ़ाइल
- 13. ब्लूटूथ के बिना HTML अनुक्रमणिका फ़ाइल में आप एकाधिक जावास्क्रिप्ट फ़ाइलों को कैसे आयात करते हैं?
- 14. प्रोजेक्ट निर्देशिका में इसे कॉपी किए बिना किसी प्रोजेक्ट में फ़ाइल को कैसे शामिल/संदर्भित किया जा सकता है?
- 15. बैच फ़ाइल प्रति में "क्या आप ओवरराइट करना चाहते हैं" सभी को नहीं कहें?
- 16. आप BSTR को wchar_t [] में कुशलतापूर्वक कॉपी कैसे करते हैं?
- 17. क्या होता है जब आप मेमोरी-मैप किए गए निष्पादन योग्य को ओवरराइट करते हैं?
- 18. सी ++ में क्लिपबोर्ड से आप कॉपी/पेस्ट कैसे करते हैं?
- 19. सर्वर सुरक्षा 0 समझौता किए बिना PHP को फ़ाइल लिखने की अनुमति कैसे देते हैं
- 20. मौजूदा फ़ाइल में टेक्स्ट डालें
- 21. कॉपी के बिना बड़ी फ़ाइल विभाजित करें?
- 22. आप एक swf फ़ाइल को कैसे संकुचित करते हैं
- 23. विंडोज़: उपयोग में फ़ाइल को ओवरराइट करें
- 24. मौजूदा मानों को ओवरराइट किए बिना NSUserDefaults का उपयोग करके उपयोगकर्ता डिफ़ॉल्ट को कैसे पंजीकृत करें?
- 25. आप मौजूदा ऑपरेटरों को आईओ में इनका उपयोग किए बिना कैसे बदलते हैं?
- 26. आप सी में फ़ाइल का आकार कैसे निर्धारित करते हैं?
- 27. ओवरराइट फ़ाइल यदि एक ही
- 28. आप बैश में फ़ाइल नाम कैसे पार्स करते हैं?
- 29. आप बिटमैपडेटा ऑब्जेक्ट में बिटमैप फ़ाइल कैसे लोड करते हैं?
- 30. बैच फ़ाइल में आप SETLOCAL का उपयोग कैसे करते हैं?
आपके पास अभी भी दौड़ की स्थिति है। लेकिन आप सही रास्ते पर हैं - यदि फॉपेन सफल होता है, तो कॉपी करने के लिए fwrite() का उपयोग करें, और पूर्ण होने पर स्रोत फ़ाइल को अनलिंक करें। –