Meteor 如何列出文件夹中的文件

Meteor 如何列出文件夹中的文件,meteor,fs,Meteor,Fs,如何使用Meteor列出文件夹中的所有文件。我的应用程序上安装了FS集合和cfs:filesystem。我没有在文档中找到它。简短的回答是FS.Collection创建了一个Mongo集合,您可以像对待其他集合一样对待它,也就是说,您可以使用find()列出条目 答案很长 使用cfs:filesystem,您可以创建一个mongo数据库来镜像服务器上的给定文件夹,如下所示: // in lib/files.js files = new FS.Collection("my_files", {

如何使用
Meteor
列出文件夹中的所有文件。我的应用程序上安装了
FS
集合和
cfs:filesystem
。我没有在文档中找到它。

简短的回答是FS.Collection创建了一个Mongo集合,您可以像对待其他集合一样对待它,也就是说,您可以使用
find()
列出条目

答案很长

使用cfs:filesystem,您可以创建一个mongo数据库来镜像服务器上的给定文件夹,如下所示:

// in lib/files.js
files = new FS.Collection("my_files", {
  stores: [new FS.Store.FileSystem("my_files", {"~/test"})] // creates a ~/test folder at the home directory of your server and will put files there on insert
});
然后,您可以在客户端访问此集合,将文件上载到服务器的~test/目录:

files.insert(new File(['Test file contents'], 'my_test_file'));
然后您可以按如下方式列出服务器上的文件:

files.find(); // returns [ { createdByTransform: true,
  _id: 't6NoXZZdx6hmJDEQh',
  original: 
   { name: 'my_test_file',
     updatedAt: (Date)
     size: (N),
     type: '' },
   uploadedAt: (Date),
   copies: { my_files: [Object] },
   collectionName: 'my_files' 
 }
copies
对象似乎包含所创建文件的实际名称,例如

files.findOne().copies
{
  "my_files" : {
  "name" : "testy1",
  "type" : "",
  "size" : 6,
  "key" : "my_files-t6NoXZZdx6hmJDEQh-my_test_file", // This is the name of the file on the server at ~/test/
  "updatedAt" : ISODate("2015-03-29T16:53:33Z"),
  "createdAt" : ISODate("2015-03-29T16:53:33Z")
  }
}
这种方法的问题在于它只跟踪通过集合所做的更改;如果手动将某些内容添加到~/test目录中,则不会将其镜像到集合中。例如,如果在服务器上运行类似于

mkfile 1k ~/test/my_files-aaaaaaaaaa-manually-created
然后我在收藏中寻找它,它不会在那里:

files.findOne({"original.name": {$regex: ".*manually.*"}}) // returns undefined

如果你只想在服务器上有一个简单的文件列表,你可以考虑只运行<代码> ls 。从中,您可以使用节点的

子进程.exec()
执行任意UNIX命令。您可以使用
process.env.PWD
(从)访问应用程序根目录。因此,最后,如果您想列出公共目录中的所有文件,例如,您可以执行以下操作:

exec = Npm.require('child_process').exec;
console.log("This is the root dir:"); 
console.log(process.env.PWD); // running from localhost returns: /Users/me/meteor_apps/test
child = exec('ls -la ' + process.env.PWD + '/public', function(error, stdout, stderr) {
  // Fill in this callback with whatever you actually want to do with the information
  console.log('stdout: ' + stdout); 
  console.log('stderr: ' + stderr);

  if(error !== null) {
    console.log('exec error: ' + error);
  }
});
这必须在服务器上运行,因此,如果您想要在客户机上获得信息,则必须将其放入一个方法中。这也是非常不安全的,这取决于您的结构,因此您需要考虑如何阻止人们列出服务器上的所有文件和文件夹,或者更糟糕的是,运行任意exec


选择哪种方法可能取决于您真正想要完成的任务。

另一种方法是添加shelljs npm模块

要添加npm模块,请参阅:

然后你只需要做如下事情:

    var shell = Meteor.npmRequire('shelljs');
    var list = shell.ls('/yourfolder');
Shelljs文档:

@michelk我想看看你是否可以使用
process.env.PWD
来获取应用程序目录。它应该在服务器上工作,但在客户端会失败。我不确定在设置存储时是否必须在客户机上指定路径,以便可以执行类似于
path:Meteor.isServer的操作?process.env.PWD+“/uploads”:“/uploads”
非常感谢,它现在可以工作了。除了文件的存储。我的文件存储在用户文件夹中创建的文件夹中,而不是我的项目中。没有提到存储路径,文件存储在myProject//.meteor/local/cfs/files/myFS\u collection\u name.EDIT:抱歉,我犯了一个错误。我再试了一次:
path:meteor.isServer?process.env.PWD+'/uploads':'/uploads'
工作正常!再次感谢!