精确字符串匹配文件名数组 JavaScript/Nodejs
Exact String Match FileName Array JavaScript/Nodejs
我目前有一个 findFile 函数,我在 forEach 循环中使用它来遍历文件名数组,然后为原始数组中的每个文件名提供一个新的文件系统路径数组:
var dir = 'Some File System Path';
const fs = require('fs');
const findFile = function (dir, pattern) {
var results = [];
fs.readdirSync(dir).forEach(function (dirInner) {
dirInner = path.resolve(dir, dirInner);
var stat = fs.statSync(dirInner);
if (stat.isDirectory()) {
results = results.concat(findFile(dirInner, pattern));
}
if (stat.isFile() && dirInner.endsWith(pattern)) {
results.push(dirInner);
}
});
return results;
};
var newFileArr = ['1.txt', 'file2.txt', 'file3.txt', 'file4.txt']
function fpArr(newFileArr) {
const fpArray = [];
newFileArr.forEach((file => {
fpArray.push(findFile(dir, file).toString())
//console.log(fpArray)
}));
OutPut:
[
/some/file/path/file1.txt,
/some/file/path/1.txt,
/some/file/path/file2.txt,
/some/file/path/file3.txt,
/some/file/path/file4.txt
]
我面临的问题是我的 findFile 寻找模式匹配,它可能在搜索 "file1.txt" 时选择了“1.txt”的路径。我知道这是一个边缘案例,但它是一个重要的边缘案例,因为其他文件名可能以相同的字母或数字结尾,我不希望在文件路径数组输出中提取这些文件名。我已经尝试了几个想法,例如“.match()”和“.startsWith”,但据我所知,这些想法仅适用于字符串文字或正则表达式,这会导致搜索本身失败。我想看看是否有办法让 findFile 函数根据某个字符串值的变量进行精确匹配?感谢任何让我朝着正确方向前进的帮助。
[
'K_01.00.0000.iar',
'HELLOWORLDKLA_01.00.0000.iar',
'HELLO_KLA_01.00.0000.iar',
'KLA_01.22.7895.iar',
'KLA_HELLO_WORLD_2_01.00.0000.iar',
'KLA_02_WORLD_01.00.0000.iar'
]
[]
以上是我实际使用的 2 个数组。第一个数组只是一个简单的文件名数组。通过同步和您 async/await 解决方案,底部数组已 运行。由于某种原因,即使添加了 RegExp,它仍然会拾取 2 个未在文件名数组中列出的文件。我添加了文件路径以显示 none 的文件位于根目录中,并将文件分散到子目录中以确保递归搜索有效。我会继续弄乱它,看看我是否能弄清楚为什么 RegExp 解决方案在不应该将这些文件带入数组时....
恐怕我没有足够的声誉来发表评论,所以我发布了一个答案!
您的代码似乎可以正常工作,如果我理解正确的话,您希望根据目录和子目录查找列表中的所有文件,从而为您提供这些文件的路径。对吗?
当我 运行 你的代码时,它确实在 newFileArr 中提取了四个文件并排除了 1.txt,我创建了一个 codesandbox 演示来向你展示虚拟文件.
我还冒昧地创建了一个 codesandbox,它演示了如何使用 RegExp 和 map 在单个函数中执行此操作以创建动态正则表达式(如果有用的话)。
我目前有一个 findFile 函数,我在 forEach 循环中使用它来遍历文件名数组,然后为原始数组中的每个文件名提供一个新的文件系统路径数组:
var dir = 'Some File System Path';
const fs = require('fs');
const findFile = function (dir, pattern) {
var results = [];
fs.readdirSync(dir).forEach(function (dirInner) {
dirInner = path.resolve(dir, dirInner);
var stat = fs.statSync(dirInner);
if (stat.isDirectory()) {
results = results.concat(findFile(dirInner, pattern));
}
if (stat.isFile() && dirInner.endsWith(pattern)) {
results.push(dirInner);
}
});
return results;
};
var newFileArr = ['1.txt', 'file2.txt', 'file3.txt', 'file4.txt']
function fpArr(newFileArr) {
const fpArray = [];
newFileArr.forEach((file => {
fpArray.push(findFile(dir, file).toString())
//console.log(fpArray)
}));
OutPut:
[
/some/file/path/file1.txt,
/some/file/path/1.txt,
/some/file/path/file2.txt,
/some/file/path/file3.txt,
/some/file/path/file4.txt
]
我面临的问题是我的 findFile 寻找模式匹配,它可能在搜索 "file1.txt" 时选择了“1.txt”的路径。我知道这是一个边缘案例,但它是一个重要的边缘案例,因为其他文件名可能以相同的字母或数字结尾,我不希望在文件路径数组输出中提取这些文件名。我已经尝试了几个想法,例如“.match()”和“.startsWith”,但据我所知,这些想法仅适用于字符串文字或正则表达式,这会导致搜索本身失败。我想看看是否有办法让 findFile 函数根据某个字符串值的变量进行精确匹配?感谢任何让我朝着正确方向前进的帮助。
[
'K_01.00.0000.iar',
'HELLOWORLDKLA_01.00.0000.iar',
'HELLO_KLA_01.00.0000.iar',
'KLA_01.22.7895.iar',
'KLA_HELLO_WORLD_2_01.00.0000.iar',
'KLA_02_WORLD_01.00.0000.iar'
]
[]
以上是我实际使用的 2 个数组。第一个数组只是一个简单的文件名数组。通过同步和您 async/await 解决方案,底部数组已 运行。由于某种原因,即使添加了 RegExp,它仍然会拾取 2 个未在文件名数组中列出的文件。我添加了文件路径以显示 none 的文件位于根目录中,并将文件分散到子目录中以确保递归搜索有效。我会继续弄乱它,看看我是否能弄清楚为什么 RegExp 解决方案在不应该将这些文件带入数组时....
恐怕我没有足够的声誉来发表评论,所以我发布了一个答案!
您的代码似乎可以正常工作,如果我理解正确的话,您希望根据目录和子目录查找列表中的所有文件,从而为您提供这些文件的路径。对吗?
当我 运行 你的代码时,它确实在 newFileArr 中提取了四个文件并排除了 1.txt,我创建了一个 codesandbox 演示来向你展示虚拟文件.
我还冒昧地创建了一个 codesandbox,它演示了如何使用 RegExp 和 map 在单个函数中执行此操作以创建动态正则表达式(如果有用的话)。