node.js xóa tệp


Câu trả lời:


804

Tôi nghĩ rằng bạn muốn sử dụng fs.unlink.

Thông tin thêm về fscó thể được tìm thấy ở đây .


137
Tôi tin rằng nó đến từ tiêu chuẩn POSIX. Nhưng bạn nghĩ rằng họ có thể thêm một deletebí danh!
Nick

11
@Nick hoặc rmFilebí danh
PixnBits 19/05/2015

9
@PixnBits hoặc rmbí danh nếu họ có rmdirphương thức
Robin

8
đối với người dùng sao băng, bạn có thể muốn sử dụngfs.unlinkSync()
Erdal G.

3
Tôi nghĩ bạn nên cung cấp một ví dụ toàn bộ, các liên kết có thể thay đổi.
vasilevich

223

Bạn có thể gọi fs.unlink(path, callback)cho hủy liên kết không đồng bộ (2) hoặc fs.unlinkSync(path)hủy liên kết đồng bộ (2).
Đâu pathlà đường dẫn tệp mà bạn muốn xóa.

Ví dụ chúng tôi muốn xóa discovery.docxtập tin khỏi c:/bookthư mục. Vì vậy, đường dẫn tập tin của tôi là c:/book/discovery.docx. Vì vậy, mã để loại bỏ tập tin đó sẽ là,

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

64

Nếu bạn muốn kiểm tra tập tin trước khi xóa xem nó có tồn tại hay không. Vì vậy, sử dụng fs.stat hoặc fs.statSync ( Đồng bộ ) thay vì fs.exists. Bởi vì theo tài liệu mới nhất của node.js , fs.existshiện không dùng nữa .

Ví dụ:-

 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');
   });  
});

Điều gì sẽ xảy ra nếu tôi kiểm tra nó tồn tại, nhưng nó bị chặn bởi một quá trình khác - hoặc, tôi kiểm tra nó tồn tại, và nó vẫn ổn, nhưng sau đó một quá trình khác sẽ chặn nó một cách ngẫu nhiên trước khi tôi có thể xóa. Làm thế nào tôi có thể chặn thẳng sau khi kiểm tra? sau đó tôi sẽ không thể xóa vì nó bị chặn

4
Lưu ý rằng fs.exists () không được dùng nữa, nhưng fs.existsSync () thì không.
Tim

1
Có một lý do khiến nó không được chấp nhận: thường thì bạn tạo điều kiện cuộc đua nếu bạn kiểm tra xem một tập tin có tồn tại trước khi xóa nó không. Thay vào đó, bạn chỉ nên gọi fs.unlinkvà nếu tệp không tồn tại, bạn sẽ gặp ENOENTlỗi trong cuộc gọi lại. Không cần kiểm tra trước khi cố gắng bỏ liên kết.
ZachB

@ZachB tại sao thao tác xóa fs.unlinkthực hiện khi tệp không tồn tại, vì vậy quan điểm của tôi là kiểm tra tệp trước khi xóa.
cây nho

Bạn không nên kiểm tra xem nó có tồn tại hay không nếu có nhiều luồng hoặc quá trình có thể đang sử dụng hoặc cố gắng xóa cùng một tệp, trong trường hợp đó, kiểm tra của bạn rằng tệp tồn tại sẽ trở nên không hợp lệ giữa thời gian bạn kiểm tra xem nó tồn tại và thời gian bạn cố gắng xóa nó Chỉ cần kiểm tra mã lỗi ENOENT trong cuộc unlinkgọi lại. Nếu lỗi đó xảy ra, tập tin đã không tồn tại. Nhìn vào câu trả lời của Searene chẳng hạn.
ZachB

34

Tôi không nghĩ bạn phải kiểm tra xem tập tin có tồn tại hay không, fs.unlinksẽ kiểm tra nó cho bạn.

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`);
    }
});

Làm thế nào tôi có thể nhận được tên hình ảnh trước đó trong Bộ điều khiển của chúng tôi?
Chaudhary

26

Đây là một đoạn nhỏ tôi làm cho mục đích này,

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 tồn tại bị phản đối nodejs.org/api/fs.html#fs_fs_exists_path_callback
Mirodinho

2
Điều gì xảy ra nếu tập tin bị xóa bởi người khác sau khi bạn kiểm tra fs.existsvà trước khi bạn xóa nó bằng fs.unlink? Nó có thể xảy ra.
Searene

4
Bạn không nên kiểm tra nếu một tập tin tồn tại trước khi cố gắng hủy liên kết nó. Chỉ cần gọi unlinkvà nếu nó không tồn tại, xử lý ENOENTlỗi. Nếu không, bạn có thể tạo một điều kiện cuộc đua.
ZachB

9

Là câu trả lời được chấp nhận, sử dụng fs.unlinkđể xóa các tập tin.

Nhưng theo tài liệu của Node.js

Sử dụng fs.stat()để kiểm tra sự tồn tại của một tập tin trước khi gọi fs.open(), fs.readFile()hoặc fs.writeFile()không được khuyến nghị. Thay vào đó, mã người dùng nên mở / đọc / ghi tệp trực tiếp và xử lý lỗi đã nêu nếu tệp không khả dụng.

Để kiểm tra xem một tập tin tồn tại mà không cần thao tác sau đó, fs.access()được khuyến khích.

để kiểm tra tập tin có thể bị xóa hay không, fs.accessthay vào đó hãy sử dụng

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

Đây là một câu trả lời hay, với tham chiếu Node.js. hầu hết mọi người sẽ sử dụng unlinktrực tiếp vì họ biết rằng họ có quyền xóa tệp. Nhưng fs.accesslà một lựa chọn tốt nếu họ cần kiểm tra trước khi xóa. Nhưng tôi nghĩ rằng nếu họ cần kiểm tra xem một tập tin có tồn tại mà không cần thao tác sau đó hay không, thì họ nên sử dụng một cách tự nhiên fs.stat, fs.accesscó một mục đích khác trong quan điểm khiêm tốn của tôi.
vdegenne

lý do tại sao tài liệu khuyên bạn không nên kiểm tra sự tồn tại là vì thông tin đó có thể thay đổi giữa cuộc gọi của bạn đến fs.stat / fs.access và hoạt động thực tế. Ví dụ: tệp có thể tồn tại khi bạn gọi fs.access và sau đó bị xóa trước khi bạn gọi fs.unlink hoặc quyền có thể thay đổi giữa hai cuộc gọi. Vì bạn phải xử lý mã lỗi của fs.unlink trong trường hợp đó, dù sao đi nữa, không có điểm nào để gọi fs.stat hoặc fs.access.
Jannis Froese

6

Dưới đây mã của tôi hoạt động tốt.

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

Tôi thích câu trả lời này nhất vì đây là câu trả lời đúng và đầy đủ đơn giản nhất cho những người muốn biết cách chạy một cái gì đó sau khi hủy liên kết hoàn thành và không quan tâm đến việc tùy chỉnh thông báo lỗi.
Colin Keenan

tại sao bạn lại sử dụng __dirname? Tôi tự hỏi nếu chúng ta có thể đặt một đường dẫn tương đối thay vì đường dẫn đầy đủ?
Bumpaster

6

2019 và Node 10+ là đây . Bên dưới phiên bản sử dụng async / await cách ngọt ngào .

Bây giờ không cần phải gói gọn fs.unlinkvào Lời hứa cũng như không sử dụng các gói bổ sung (như fs-extra) nữa.

Chỉ cần sử dụng API hứa hẹn fs gốc .

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);
  }
})();

Đây là fsPromises.unlink thông số kỹ thuật từ các tài liệu Node.

Ngoài ra, xin lưu ý rằng API fs.promises được đánh dấu là thử nghiệm trong Nút 10.xx (tuy nhiên hoạt động hoàn toàn tốt) và không còn thử nghiệm kể từ đó 11.14.0.


3

bạn có thể sử dụng mô-đun del để xóa một hoặc nhiều tệp trong thư mục hiện tại. Điều tuyệt vời ở đây là bảo vệ bạn khỏi việc xóa thư mục làm việc hiện tại trở lên.

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

Nếu bạn cần xóa nhiều tập tin, đây là một lựa chọn tuyệt vời! Cảm ơn vì đã góp ý.
Samuel Earl

2

Bạn có thể sử dụng chức năng fs.unlink (đường dẫn, gọi lại) . Dưới đây là một ví dụ về trình bao bọc hàm với mẫu "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

Loại bỏ các tập tin từ thư mục phù hợp với regrec cho tên tệp. Chỉ sử dụng fs.unlink - để xóa tệp, fs.readdir - để lấy tất cả các tệp từ một thư mục

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

Nó rất dễ dàng với fs.

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



-1

Đây là mã nơi bạn có thể xóa tập tin / hình ảnh từ thư mục.

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

Vì nút 7, đối số gọi lại không còn là tùy chọn và sẽ dẫn đến cảnh báo. Truyền một hàm trống nếu bạn thực sự không quan tâm đến nó.
jlh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.