როგორ წავშალო ფაილი PHP-ში? php-ის კავშირის გაუქმება - ფაილების წაშლა როგორ მუშაობს ეს ყველაფერი.

ვაგრძელებთ გაკვეთილს, რომელიც ეძღვნება თემას ” PHP ფაილებთან მუშაობა" თუ წინა არ წაგიკითხავთ, გირჩევთ წაიკითხოთ და ვისაც წაკითხული აქვს, გადავიდეთ. ამ გაკვეთილზე თქვენ შეისწავლით თუ როგორ წაშალოთ შექმნილი ან არსებული ფაილი PHP-ის გამოყენებით, დააკოპიროთ ან გადაარქვათ სახელი, ჩაკეტოთ ფაილი.
აბა, თუ მზად ხარ, მაშინ წადი ბრძოლაში...

ფაილის წაშლა PHP-ში

თუ რომელიმე ფაილის წაშლა გჭირდებათ, გამოიყენეთ PHP unlink() ფუნქცია:

გაუქმება (ფაილის სახელი);

ფაილის სახელი - აქ შეიყვანეთ ფაილის სახელი, რომლის წაშლა გსურთ.

ვთქვათ, ჩვენ უნდა წავშალოთ ფაილი "file.txt", შევსების მაგალითი იქნება ასეთი:

გაუქმება ("file.txt");

მზა კოდი:



თუ ფაილი "file.txt" იყო, სკრიპტმა ის წაშალა.

ფაილის კოპირება PHP-ში

თუ თქვენ გჭირდებათ შინაარსის გადაწერა ერთი ფაილიდან მეორე ფაილში, გამოიყენეთ PHP copy() ფუნქცია.

კოპირება ("ფაილი1", "ფაილი2");

File1 – ფაილის სახელი, საიდანაც მოხდება ტექსტის კოპირება
- file2 – ფაილის სახელი, სადაც მოხდება ტექსტის კოპირება

მაგალითად, შექმენით ფაილი სახელწოდებით "file2.txt" თქვენს ლოკალურ სერვერზე "test-1" საქაღალდეში. დაე, ფაილი ცარიელი იყოს. ახლა მოდით ჩასვით ეს კოდი copy ("file.txt", "file2.txt"); php კოდში "file.php":



რა გავაკეთეთ? შექმენით ფაილი სახელწოდებით "file.txt" PHP-ის საშუალებით, გააკეთეთ ჩანაწერი ფაილში "file.txt" PHP-ის საშუალებით. მიხარია თქვენი ნახვა ბლოგის საიტზე ", აჩვენა შედეგი ბრაუზერში, დააკოპირა ტექსტი ფაილიდან "file.txt" და ჩასვით ფაილში "file2.txt". არ გჯერა რომ ეს მოხდა? გახსოვთ, რომ ფაილი “file2.txt” ცარიელი იყო?! გახსენი! და რას ხედავ? დიახ, ასეა, ტექსტი, რომელიც იყო ფაილში "file.txt":

ფაილის გადარქმევა PHP-ში

ფაილის გადარქმევისთვის გამოიყენეთ PHP rename() ფუნქცია:

გადარქმევა ("ფაილი1", "ფაილი2");

File1 - ფაილის სახელი, რომელიც უნდა შეიცვალოს ( გადარქმევა)
- file2 - აქ თქვენ უნდა მიუთითოთ ფაილის ახალი სახელი

აქ არის მაგალითი, რომელიც უნდა შეავსოთ:

გადარქმევა ("file2..txt");

აქ არის დასრულებული კოდი:



ფაილს "file2.txt" დაერქვა ფაილი "site.txt".

სწორედ აქ უნდა დავასრულოთ ჩვენი გაკვეთილი. მაგრამ ეს ყველაფერი არ არის, შემდეგ გაკვეთილზე ჩვენ გავაგრძელებთ ფაილებთან მუშაობას.

წინა სტატიაში ვისაუბრეთ ამაზე და იქ გაგაცანით ფუნქცია rmdir(), რომელიც წაშლის დირექტორიას. თუმცა, მე ვთქვი, რომ ამ გზით შეგიძლიათ წაშალოთ მხოლოდ ცარიელი დირექტორია, მაგრამ როგორ წაშალოთ დირექტორია ფაილებით, ახლავე გაიგებთ.

პრინციპი ძალიან მარტივია: რომ წაშალე დირექტორია ფაილებით, ჯერ უნდა წაშალოთ ყველა ფაილი, ისევე როგორც ყველა ქვეცნობარი. შეიძლება ასევე იყოს ფაილები და სხვა ქვედირექტორიები ქვედირექტორიებში, ისინი ასევე უნდა გასუფთავდეს. ზოგადად, სირთულე ის არის, რომ დირექტორიების სიღრმე შეიძლება იყოს ძალიან დიდი. და აშკარაა, რომ რეკურსია თავისთავად გვთავაზობს - ფუნქციის საკუთარ თავში გამოძახებას.

ალგორითმის აშკარა სირთულის მიუხედავად, განხორციელება ძალიან მარტივი და გამჭვირვალეა:

ფუნქცია removeDirectory($dir) (
თუ ($objs = glob($dir."/*")) (
foreach ($objs როგორც $obj) (
is_dir($obj) ? removeDirectory($obj) : unlink($obj);
}
}
rmdir ($dir);
}
?>

შევეცდები ნათლად ავხსნა ამ ფუნქციის ალგორითმი. პირველ რიგში, ჩვენ ვიღებთ ყველა ფაილის სიას მოცემულ დირექტორიაში. თუ ისინი იქ არ არიან, მაშინვე წაშალეთ იგი. თუ ისინი არსებობენ, მაშინ ჩვენ ვიწყებთ მათ სათითაოდ დახარისხებას. თუ ელემენტი არის ფაილი, უბრალოდ წაშალეთ იგი ( გაუქმება ($obj)). თუ ეს არის დირექტორია, მაშინ ჩვენ კვლავ მოვუწოდებთ ჩვენს ფუნქციას, გადავცემთ ამ დირექტორიას. ეს არის რეკურსია: ფუნქცია თავის თავს უწოდებს. ფუნქციის თავისთავად გამოძახების შემდეგ, ყველაფერი თავიდან იწყება, მაგრამ სხვა დირექტორიაში. მისი ყველა ფაილი ასევე წაიშლება და მისი ყველა დირექტორია იგზავნება უკან ამ ფუნქციაში. როდესაც ყველა დირექტორია და ფაილი წაიშლება, უკვე ცარიელი დირექტორია წაიშლება.

ამას გეტყვით, ეს ალგორითმი არც ისე სასარგებლოა პრაქტიკული თვალსაზრისით (ასე ხშირად არ არის საჭირო წაშალეთ დირექტორიები ფაილებით PHP-ში), რამდენად სასარგებლოა ეს თქვენი აზროვნების განვითარებისთვის. ეს არის ძალიან მარტივი ალგორითმი და წყვეტს ძალიან, ძალიან რთულ პრობლემას. ამიტომ, ისწავლეთ ალგორითმების შედგენა - ეს არის ყველაზე მნიშვნელოვანი პროგრამირების ნებისმიერ ენაში.

8 წლის წინ

წაშალეთ დიდი ფაილი, მაგრამ ვერ ხედავთ თავისუფალი სივრცის გაზრდას ან დისკის გამოყენების შემცირებას? იყენებთ UNIX-ს ან სხვა POSIX OS-ს?

unlink() არ ეხება ფაილის წაშლას, ეს არის ფაილის სახელის წაშლა. manpage ამბობს: `` unlink - წაშალეთ სახელი და შესაძლოა ფაილი, რომელსაც ის ეხება“".

უმეტეს შემთხვევაში, ფაილს მხოლოდ ერთი სახელი აქვს -- მისი წაშლა ასევე წაშლის (თავისუფალი, განლაგდება) ფაილის `სხეული“ (ერთი გაფრთხილებით, იხილეთ ქვემოთ). ეს მარტივი, ჩვეულებრივი შემთხვევაა.

თუმცა, "ძალიან კარგია, რომ ფაილს ჰქონდეს რამდენიმე სახელი (იხილეთ ბმული() ფუნქცია), ერთსა და იმავე ან სხვადასხვა დირექტორიაში. ყველა სახელი მიუთითებს ფაილის სხეულზე და `ინარჩუნებს მას ცოცხალი~, ასე ვთქვათ. მხოლოდ მაშინ, როდესაც ყველა სახელი წაიშლება, ფაილის სხეული რეალურად თავისუფლდება.

გაფრთხილება:
ფაილის სხეული შეიძლება *ასევე* იყოს "ცოცხალი" (ჯერ კიდევ იყენებს დისკის სივრცეს) ფაილის გახსნის შენარჩუნების პროცესით. სხეული არ იქნება განაწილებული (არ გაათავისუფლებს დისკზე ადგილს), სანამ პროცესი მას ღიად ინახავს. სინამდვილეში, არსებობს შეცდომით ამოღებული ფაილის აღდგენის შესანიშნავი გზა, მაგრამ პროცესის დროს კვლავ ღიაა ...

10 წლის წინ

მე ვმუშაობდი მცირე ცდაზე, სადაც შეიქმნა სარეზერვო ფაილი ძირითადი ტექსტური ფაილის შეცვლამდე. შეცდომის დაშვების შემდეგ, მთავარი ფაილი წაიშლება (გაუკავშირდება) და სარეზერვო ფაილი დაბრუნდება მის ნაცვლად.

თუმცა, მე დაახლოებით ერთი საათის განმავლობაში ვიტეხავ თავს იმის თაობაზე, თუ რატომ ვერ მივიღე ჩემი ნებართვა, რომ გავაუქმო მთავარი ფაილი.

ბოლოს მივხვდი, რა იყო არასწორი: რადგან ფაილზე ვმუშაობდი და ფაილი ჯერ არ მქონდა დახურული, ის ჯერ კიდევ ხმარებაში იყო და რა თქმა უნდა ვერ წაიშალა :)

ასე რომ, მე ვფიქრობდი, რომ აქ მეთქვა ეს, რათა თავიდან ავიცილოთ სხვების მიერ იგივე შეცდომის დაშვება:

// ჯერ დახურეთ ფაილი
fclose ($fp);

// შემდეგ გააუქმე ბმული :)
გაუქმება ($somefile);
?>

14 წლის წინ

კონკრეტული გაფართოების ყველა ფაილის წასაშლელად, ან ფაქტობრივად, ყველა წაშლის სიმბოლოს გამოყენებით, ძალიან მარტივი გზაა glob ფუნქციის გამოყენება. თქვი, რომ მინდოდა ყველა jpg წაშლა.........

Foreach (glob ("*.jpg" ) როგორც $filename ) (
echo "$filename size" . ფაილის ზომა ($filename) . "\n" ;
გაუქმება ($filename);
}

?>

10 წლის წინ

ვისაც ჰქონდა პრობლემა ნებართვების უარყოფის შეცდომასთან დაკავშირებით, ეს ზოგჯერ გამოწვეულია, როდესაც ცდილობთ წაშალოთ ფაილი, რომელიც მდებარეობს იერარქიის უფრო მაღალ საქაღალდეში თქვენს სამუშაო დირექტორიაში (მაგ., როდესაც ცდილობთ წაშალოთ გზა, რომელიც იწყება. "../"-ით).

ასე რომ, ამ პრობლემის გადასაჭრელად, შეგიძლიათ გამოიყენოთ chdir(), რათა შეცვალოთ სამუშაო დირექტორია საქაღალდეში, სადაც მდებარეობს ფაილი, რომლის გაუქმებაც გსურთ.

$old = getcwd(); // შეინახეთ მიმდინარე დირექტორია
chdir($path_to_file);
გაუქმება ($filename);
ჩდირი ($ძველი); // ძველი სამუშაო დირექტორიას აღდგენა
?>

4 წლის წინ

OSX-ზე, როდესაც ებრძვით შეცდომის "ნებართვას უარყოფილია", დარწმუნდით, რომ დირექტორიას აქვს WRITE ნებართვა შემსრულებელი php მომხმარებლისთვის.

გარდა ამისა, თუ თქვენ ეყრდნობით ACL-ებს და გსურთ წაშალოთ ფაილი ან სიმბლაკი, მის შემცველ დირექტორიას უნდა ჰქონდეს „delete_child“ ნებართვა, რათა გააუქმოს ნივთები შიგნით. თუ საქაღალდეს მხოლოდ „delete“-ს ანიჭებთ, ეს საშუალებას მოგცემთ წაშალოთ თავად კონტეინერის საქაღალდე, მაგრამ არა შიგნით არსებული ობიექტები.

4 წლის წინ

ეს შეიძლება აშკარად ჩანდეს, მაგრამ მე ამ პრობლემის გამო თმას ვიშლიდი - დარწმუნდით, რომ ფაილი, რომლის წაშლასაც ცდილობთ, ამჟამად არ გამოიყენება. მე მქონდა სკრიპტი, რომელიც აანალიზებდა ტექსტურ ფაილს და უნდა წამეშვა მისი დასრულების შემდეგ, მაგრამ გამუდმებით ვიღებდი ნებართვის უარყოფის შეცდომას, რადგან ცალსახად არ მქონდა დახურული ფაილი, მაშასადამე, ის ტექნიკურად ჯერ კიდევ "გამოიყენებოდა", მიუხედავად იმისა, რომ პარსინგი იყო სრული.

11 წლის წინ

Ggarciaa-ს ზემოთ მოცემულ პოსტს უკვე აქვს ერთი პატარა შეცდომა, closeir უნდა იქნას გამოყენებული მაშინაც კი, თუ $DeleteMe არის ყალბი











}

Closedir ($dh);
თუ ($DeleteMe)(
@rmdir ($dir);
}
}

?>

9 თვის წინ

შეცდომის „რესურსი მიუწვდომელია“ დამუშავება unlink()-ით, როგორც გამონაკლისი, try catch-ის გამოყენებით

მაშინაც კი, is_file() ან file_exists() შეამოწმებს, არის თუ არა ფაილი, არსებობს შანსი, რომ ფაილი გამოიყენოს ზოგიერთმა აპლიკაციამ, რაც ხელს შეუშლის წაშლას და unlink() აჩვენებს შეცდომას "Resource Unavailable".

მრავალი მეთოდის ცდის შემდეგ, როგორიცაა: `is_resource()`, `is_writable()`, `stream_get_meta_data()`... და ა.შ., მივაღწიე შეცდომის დამუშავების ერთადერთ საუკეთესო გზას *"წაშლის"* ფაილის, რომელიც არის * *არ არსებობს** ან **არსებობს, მაგრამ გამოიყენება ზოგიერთი აპლიკაციის მიერ**

ფუნქცია delete_file ($pFilename)
{
თუ (ფაილი_არსებობს ($pFilename)) (
// დაამატა muhammad.begawala
// "@" შეწყვეტს "რესურსების მიუწვდომელი" შეცდომის ჩვენებას იმის გამო, რომ ფაილი ღიაა.
// "unlink($pFilename) !== true" შეამოწმებს, წაშლილია თუ არა ფაილი წარმატებით.
// გამონაკლისის სროლა ისე, რომ შეცდომებს მარტივად გავუმკლავდეთ, მომხმარებლებისთვის ჩვენების ნაცვლად.
if(@unlink ($pFilename) !== true)
throw new Exception("ვერ წაშალე ფაილი: " . $pFilename . " გთხოვთ დახუროთ ყველა აპლიკაცია, რომელიც მას იყენებს.");
}
დაბრუნება true;
}

/* === გამოყენება === */

სცადე (
if(delete_file("hello_world.xlsx") === true)
echo "ფაილი წაშლილია";
}
დაჭერა (გამონაკლისი $e) (
echo $e->getMessage(); // დაბეჭდავს ზემოთ განსაზღვრულ გამონაკლის შეტყობინებას.
}

11 წლის წინ

Ggarciaa-ს ზემოთ მოცემულ პოსტს აქვს ერთი პატარა შეცდომა, ის იგნორირებას უკეთებს ფაილის და დირექტორიაში სტრიქონებს, რომლებიც შეფასებულია როგორც მცდარი (ანუ "0")

დაფიქსირებული კოდი არის ქვემოთ (მცდარი !==)

// ggarciaa at gmail dot com (04-ივლისი-2007 01:57)
// მჭირდებოდა დირექტორიის დაცლა, მაგრამ შენახვა
// ასე რომ, მე ოდნავ შევცვალე წვლილი
// სტეფანო და ტაკის წერტილები (28-დეკ-2005 11:57)
// მოკლე, მაგრამ ძლიერი რეკურსიული ფუნქცია
// მუშაობს ასევე, თუ dirs შეიცავს დამალულ ფაილებს
// $dir = სამიზნე დირექტორია
// $DeleteMe = თუ მართალია წაშალეთ ასევე $dir, თუ false დატოვეთ თავი

ფუნქცია SureRemoveDir ($dir, $DeleteMe) (
if(! $dh = @ opendir ($dir )) დაბრუნება;
ხოლო (მცდარი !== ($obj = readdir ($dh ))) (
if($obj == "." || $obj == ".." ) გაგრძელება;
if (!@ გაუქმება ($dir . "/" . $obj )) SureRemoveDir ($dir. "/" . $obj , true );
}
თუ ($DeleteMe)(
closeir($dh);
@rmdir ($dir);
}
}

//SureRemoveDir("EmptyMe", false);
//SureRemoveDir("RemoveMe", true);

?>

8 წლის წინ

მიბმის გაუქმება შეიძლება ვერ მოხდეს ფაილზე ODBC ბრძანებების გამოყენების შემდეგ (Windows).

არც ერთიარცშეასრულა ხრიკი.

მხოლოდგაათავისუფლეთ ფაილი ისე, რომ შეიძლება წაიშალოს შემდეგ ...

PHP არის პროგრამირების ენა, რომელიც ძირითადად გამოიყენება დინამიური ვებ გვერდების შესაქმნელად. ისევე როგორც ნებისმიერი სხვა პროგრამირების ენა, PHP შეიცავს უამრავ ფუნქციას, მათ შორის ბევრ სასარგებლოს. მაგალითად, ფაილის წაშლის შესაძლებლობა, რომელიც შეგიძლიათ გამოიყენოთ თქვენს სკრიპტებში.

ეს რჩევა დაგეხმარებათ გაიგოთ როგორ წაშალეთ ფაილი PHP-შიფუნქციის გამოყენებით გაუქმება.

ნაბიჯ-ნაბიჯ ინსტრუქცია:

PHP-ში ფაილის წასაშლელად შეგიძლიათ გამოიყენოთ ფუნქცია გაუქმება. მაგალითად, მარტივი სკრიპტის გამოყენებით, მოდით შევხედოთ ნამუშევარს გაუქმება:

  1. შექმენით ტექსტური ფაილი ტექსტურ რედაქტორში (vi/vim, nano, gedit ან უბრალოდ სტანდარტული Notepad).
  2. ჩაწერეთ ან უბრალოდ დააკოპირეთ მასში შემდეგი კოდი:$file="example.log";
    გაუქმება ($ფაილი);
    ?>
  3. შეინახეთ (მაგალითად, სახელწოდებით testunlink.php) და მოათავსეთ შექმნილი სკრიპტის ფაილი თქვენს სატესტო ვებ სერვერზე. იმავე დირექტორიაში შექმენით example.log ფაილი ნებისმიერი შინაარსით. ეს არის ის, რასაც ჩვენ წავშლით.
  4. გაუშვით სკრიპტი თქვენს ბრაუზერში დარეკვით, და როდესაც კვლავ გადახედავთ დირექტორიაში, აღმოაჩენთ, რომ example.log ფაილი აღარ არის. კავშირის გაუქმებაგააკეთა ხრიკი!

როგორ მუშაობს ეს ყველაფერი:

სკრიპტის კოდის პირველი ხაზი: ჩვენ განვსაზღვრავთ ჩვენი სკრიპტის ტიპს.

კოდის მეორე ხაზი: ჩვენ მიერ შექმნილი სკრიპტის გაშვების შემდეგ, ფაილის ცვლადს მიენიჭება მნიშვნელობა მაგალითი.ლოგი(გაითვალისწინეთ, რომ ფაილი იგივე სახელით უნდა იყოს წარმოდგენილი იმავე დირექტორიაში, როგორც ჩვენ მიერ შექმნილი სკრიპტი. უბრალოდ შექმენით იგი ნებისმიერი შინაარსით!).

კოდის მესამე ხაზი: წაშალეთ example.log ფაილი არგუმენტად გადაცემით unlink ფუნქციაზე.

სკრიპტის კოდის მეოთხე ხაზი: php კოდის დასასრული.



 

შეიძლება სასარგებლო იყოს წაკითხვა: