node.js ลบไฟล์


คำตอบ:


804

fs.unlinkฉันคิดว่าคุณต้องการที่จะใช้

ข้อมูลเพิ่มเติมเกี่ยวกับfsสามารถพบได้ที่นี่


137
ฉันเชื่อว่ามาจากมาตรฐาน POSIX แต่คุณคิดว่าพวกเขาสามารถเพิ่มdeleteชื่อแทนได้!
นิค

11
@Nick or rmFilealias
PixnBits

9
@PixnBits หรือrmนามแฝงหากพวกเขามีrmdirวิธีการ
Robin

8
สำหรับผู้ใช้ Meteor คุณอาจต้องการใช้fs.unlinkSync()
Erdal G.

3
ฉันคิดว่าคุณควรให้ตัวอย่างทั้งหมดลิงก์สามารถเปลี่ยนแปลงได้
vasilevich

223

คุณสามารถโทรfs.unlink(path, callback)หา Asynchronous unlink (2) หรือfs.unlinkSync(path)Unlink Synchronous (2) ไฟล์พา ธ
อยู่ที่ไหนpathที่คุณต้องการลบ

ตัวอย่างเช่นเราต้องการลบdiscovery.docxไฟล์ออกจากc:/bookไดเรกทอรี c:/book/discovery.docxดังนั้นไฟล์เส้นทางของฉันคือ ดังนั้นรหัสสำหรับการลบไฟล์นั้นจะเป็น

var fs = require('fs');
var filePath = 'c:/book/discovery.docx'; 
fs.unlinkSync(filePath);

64

ถ้าคุณต้องการตรวจสอบไฟล์ก่อนที่จะลบมันมีอยู่หรือไม่ ดังนั้นการใช้fs.statหรือfs.statSync ( Synchronous ) fs.existsแทน เพราะตาม Node.js ล่าสุดเอกสาร , fs.existsตอนนี้เลิกใช้

ตัวอย่างเช่น:-

 fs.stat('./server/upload/my.csv', function (err, stats) {
   console.log(stats);//here we got all information of file in stats variable

   if (err) {
       return console.error(err);
   }

   fs.unlink('./server/upload/my.csv',function(err){
        if(err) return console.log(err);
        console.log('file deleted successfully');
   });  
});

จะเกิดอะไรขึ้นถ้าฉันตรวจสอบว่ามันมีอยู่ แต่มันถูกบล็อกโดยกระบวนการอื่น - หรือฉันจะตรวจสอบมันมีอยู่และมันก็ดี แต่แล้วกระบวนการอื่นจะทำการสุ่มบล็อกก่อนที่ฉันจะสามารถลบได้ ฉันจะบล็อกหลังการตรวจสอบได้อย่างไร จากนั้นจะไม่สามารถลบสิ่งที่ถูกบล็อกได้

4
โปรดทราบว่า fs.exists () เลิกใช้แล้ว แต่ fs.existsSync () ไม่ใช่
ทิม

1
มีเหตุผลที่เลิกใช้บ่อยครั้งที่คุณสร้างเงื่อนไขการแข่งขันถ้าคุณตรวจสอบว่ามีไฟล์อยู่ก่อนที่จะลบ คุณควรโทรออกเท่านั้นfs.unlinkและหากไฟล์ไม่มีอยู่คุณจะพบENOENTข้อผิดพลาดในการโทรกลับ ไม่จำเป็นต้องตรวจสอบก่อนที่จะพยายามยกเลิกการเชื่อมโยง
ZachB

@ZachB เหตุใดการดำเนินการลบจะfs.unlinkทำงานเมื่อไม่มีไฟล์อยู่ดังนั้นมุมมองของฉันคือไฟล์ตรวจสอบก่อนลบ
เถาวัลย์

คุณไม่ควรตรวจสอบว่ามีอยู่หรือไม่หากมีหลายเธรดหรือกระบวนการที่อาจใช้หรือพยายามลบไฟล์เดียวกันซึ่งในกรณีนี้การตรวจสอบของคุณว่าไฟล์ที่มีอยู่จะไม่ถูกต้องในช่วงเวลาที่คุณตรวจสอบว่ามีอยู่และเวลา คุณพยายามที่จะลบมัน เพียงตรวจสอบรหัสข้อผิดพลาด ENOENT ในการunlinkติดต่อกลับ หากข้อผิดพลาดนั้นเกิดขึ้นแสดงว่าไฟล์นั้นไม่มีอยู่ ดูคำตอบของ Searene
ZachB

34

ฉันไม่คิดว่าคุณต้องตรวจสอบว่ามีไฟล์อยู่หรือไม่fs.unlinkจะตรวจสอบให้คุณ

fs.unlink('fileToBeRemoved', function(err) {
    if(err && err.code == 'ENOENT') {
        // file doens't exist
        console.info("File doesn't exist, won't remove it.");
    } else if (err) {
        // other errors, e.g. maybe we don't have enough permission
        console.error("Error occurred while trying to remove file");
    } else {
        console.info(`removed`);
    }
});

ฉันจะได้รับชื่อภาพก่อนหน้าในคอนโทรลเลอร์ของเราได้อย่างไร?
Chaudhary

26

นี่คือตัวอย่างเล็ก ๆ ของฉันทำเพื่อจุดประสงค์นี้

var fs = require('fs');
var gutil = require('gulp-util');

fs.exists('./www/index.html', function(exists) {
  if(exists) {
    //Show in green
    console.log(gutil.colors.green('File exists. Deleting now ...'));
    fs.unlink('./www/index.html');
  } else {
    //Show in red
    console.log(gutil.colors.red('File not found, so not deleting.'));
  }
});

4
Async มีอยู่แล้วเลิกใช้แล้วnodejs.org/api/fs.html#fs_fs_exists_path_callback
Mirodinho

2
เกิดอะไรขึ้นถ้าไฟล์ถูกลบโดยคนอื่น ๆ หลังจากที่คุณตรวจสอบกับfs.existsและก่อนที่คุณจะเอามันออกไปด้วยfs.unlink? มันอาจเกิดขึ้น
เซียรีน

4
คุณไม่ควรตรวจสอบว่ามีไฟล์อยู่ก่อนที่จะพยายามยกเลิกการเชื่อมโยงหรือไม่ เพียงแค่โทรunlinkและถ้ามันไม่มีอยู่จัดการENOENTข้อผิดพลาด มิฉะนั้นคุณสามารถสร้างเงื่อนไขการแข่งขัน
ZachB

9

เป็นคำตอบที่ยอมรับใช้fs.unlinkเพื่อลบไฟล์

แต่ตามเอกสารของ Node.js

ใช้fs.stat()ในการตรวจสอบสำหรับการดำรงอยู่ของไฟล์ก่อนที่จะเรียกfs.open(), fs.readFile()หรือfs.writeFile()ไม่แนะนำ แต่รหัสผู้ใช้ควรเปิด / อ่าน / เขียนไฟล์โดยตรงและจัดการกับข้อผิดพลาดที่เกิดขึ้นหากไฟล์ไม่พร้อมใช้งาน

หากต้องการตรวจสอบว่ามีไฟล์อยู่หรือไม่โดยไม่ได้จัดการกับมันหลังจากนั้นfs.access()ขอแนะนำ

เพื่อตรวจสอบว่าสามารถลบไฟล์ได้หรือไม่ใช้fs.accessแทน

fs.access('/etc/passwd', fs.constants.R_OK | fs.constants.W_OK, (err) => {
  console.log(err ? 'no access!' : 'can read/write');
});

นี่เป็นคำตอบที่ดีพร้อมการอ้างอิง Node.js คนส่วนใหญ่จะใช้unlinkโดยตรงเพราะพวกเขารู้ว่าพวกเขามีสิทธิ์ในการลบไฟล์ แต่fs.accessเป็นทางเลือกที่ดีหากพวกเขาจำเป็นต้องตรวจสอบก่อนที่จะลบ แต่ผมคิดว่าถ้าพวกเขาต้องตรวจสอบว่าไฟล์ที่มีอยู่โดยไม่ต้องจัดการกับมันหลังจากนั้นพวกเขาเป็นธรรมชาติควรใช้fs.stat, fs.accessมีจุดประสงค์ที่แตกต่างกันในความต่ำต้อยของฉัน
vdegenne

เหตุผลที่เอกสารแนะนำไม่ให้ตรวจสอบว่ามีอยู่เพราะข้อมูลนั้นสามารถเปลี่ยนระหว่างการโทรของคุณเป็น fs.stat / fs.access และการทำงานจริง ตัวอย่างเช่นไฟล์อาจมีอยู่เมื่อคุณโทร fs.access จากนั้นจะถูกลบก่อนที่คุณจะโทร fs.unlink มิฉะนั้นสิทธิ์อาจเปลี่ยนแปลงระหว่างการโทรสองครั้ง เนื่องจากคุณต้องจัดการกับรหัสข้อผิดพลาดของ fs.unlink ในกรณีนั้นอย่างไรก็ตามไม่มีจุดในการเรียก fs.stat หรือ fs.access
Jannis Froese

6

ด้านล่างรหัสของฉันซึ่งใช้งานได้ดี

         const fs = require('fs');
         fs.unlink(__dirname+ '/test.txt', function (err) {            
              if (err) {                                                 
                  console.error(err);                                    
              }                                                          
             console.log('File has been Deleted');                           
          });                                                            

ฉันชอบคำตอบนี้ดีที่สุดเพราะเป็นคำตอบที่สมบูรณ์และง่ายที่สุดสำหรับผู้ที่ต้องการทราบว่าจะใช้งานอย่างไรหลังจากยกเลิกการเชื่อมโยงแล้วและไม่สนใจเกี่ยวกับการปรับแต่งข้อความแสดงข้อผิดพลาด
โคลินคีแนน

ทำไมคุณใช้ชื่อ __ ฉันสงสัยว่าเราจะวางเส้นทางสัมพัทธ์แทนเส้นทางเต็มได้ไหม?
Bumpaster

6

2019 และโหนด 10+ อยู่ที่นี่ ด้านล่างรุ่นโดยใช้หวานasync / รอคอยทาง

ตอนนี้ไม่จำเป็นต้องห่อfs.unlinkเป็นสัญญาหรือใช้แพ็คเกจเพิ่มเติม (เช่นfs-extra) อีกต่อไป

เพียงใช้API Promises APIดั้งเดิม

const fs = require('fs').promises;

(async () => {
  try {
    await fs.unlink('~/any/file');
  } catch (e) {
    // file doesn't exist, no permissions, etc..
    // full list of possible errors is here 
    // http://man7.org/linux/man-pages/man2/unlink.2.html#ERRORS
    console.log(e);
  }
})();

นี่คือ fsPromises.unlinkข้อมูลจำเพาะจาก Node docs

นอกจากนี้ยังโปรดทราบว่า fs.promises API ทำเครื่องหมายว่าการทดลองในโหนด 10.xx ( แต่ทำงานโดยสิ้นเชิงปรับแม้ว่า) 11.14.0และไม่มีการทดลองตั้งแต่


3

คุณสามารถใช้โมดูลdelเพื่อลบไฟล์อย่างน้อยหนึ่งไฟล์ในไดเรกทอรีปัจจุบัน สิ่งที่ดีเกี่ยวกับมันคือการปกป้องคุณจากการลบไดเรกทอรีทำงานปัจจุบันและด้านบน

const del = require('del');
del(['<your pathere here>/*']).then( (paths: any) => {
   console.log('Deleted files and folders:\n', paths.join('\n'));
});

หากคุณต้องการลบไฟล์หลาย ๆ ไฟล์นี่เป็นตัวเลือกที่ยอดเยี่ยม! ขอบคุณสำหรับคำแนะนำ
ซามูเอลเอิร์ล

2

คุณสามารถใช้ฟังก์ชั่นfs.unlink (path, callback) นี่คือตัวอย่างของ wrapper ฟังก์ชันที่มีรูปแบบ "error-back":

// Dependencies.
const fs = require('fs');

// Delete a file.
const deleteFile = (filePath, callback) => {
  // Unlink the file.
  fs.unlink(filePath, (error) => {
    if (!error) {
      callback(false);
    } else {
      callback('Error deleting the file');
    }
  })
};


2

ลบไฟล์ออกจากไดเรกทอรีที่ตรงกับ regexp สำหรับชื่อไฟล์ ใช้เฉพาะ fs.unlink - เพื่อลบไฟล์ fs.readdir - เพื่อรับไฟล์ทั้งหมดจากไดเรกทอรี

var fs = require('fs');
const path = '/path_to_files/filename.anyextension'; 

const removeFile = (fileName) => {
    fs.unlink(`${path}${fileName}`, function(error) {
        if (error) {
            throw error;
        }
        console.log('Deleted filename', fileName);
    })
}

const reg = /^[a-zA-Z]+_[0-9]+(\s[2-4])+\./

fs.readdir(path, function(err, items) {
    for (var i=0; i<items.length; i++) {
        console.log(items[i], ' ', reg.test(items[i]))
        if (reg.test(items[i])) {
           console.log(items[i])
           removeFile(items[i]) 
        }
    }
});

2

มันง่ายมากกับ fs

var fs = require('fs');
try{
 var sourceUrls = "/sampleFolder/sampleFile.txt";
 fs.unlinkSync(sourceUrls);
}catch(err){
 console.log(err);
}



-1

นี่คือรหัสที่คุณสามารถลบไฟล์ / ภาพจากโฟลเดอร์

var fs = require('fs'); 
Gallery.findById({ _id: req.params.id},function(err,data){ 
    if (err) throw err;
    fs.unlink('public/gallery/'+data.image_name);
 });

ตั้งแต่โหนด 7 อาร์กิวเมนต์การโทรกลับจะเป็นทางเลือกอีกต่อไปและจะส่งผลให้มีคำเตือน ผ่านฟังก์ชั่นที่ว่างเปล่าถ้าคุณไม่สนใจมัน
jlh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.