无法使用node.js中的javascript在Windows中删除文件

无法使用node.js中的javascript在Windows中删除文件,javascript,node.js,Javascript,Node.js,我有以下代码试图删除windows 7计算机上的文件: // check if this item has an uploaded image file var imageFullPathName = __dirname + "/../public/images/" + req.params.itemId; logger.log("imageFullPathName = " + imageFullPathName); var normalizedPathName

我有以下代码试图删除windows 7计算机上的文件:

    // check if this item has an uploaded image file
    var imageFullPathName = __dirname + "/../public/images/" + req.params.itemId;
    logger.log("imageFullPathName = " + imageFullPathName);
    var normalizedPathName = path.normalize(imageFullPathName);
    logger.log("normalizedPathName = " + normalizedPathName);

    // delete the image if it exists
    fs.exists(normalizedPathName, function(exists) {
        console.log("Found the file: " + normalizedPathName);
        normalizedPathName = normalizedPathName.replace(/\\/g,"\\\\");
        console.log("New path name = " + normalizedPathName);
        fs.unlink(normalizedPathName, function(err){
            if (err){
                console.error("Error in call to fs.unlink");
            }
        });
    });
我得到以下输出:

imageFullPathName= C:\IronKey\hes\CSCI-71\project\medical interchange\routes/。/public/images/5658E561213CB2C41000006

规范化路径名= C:\IronKey\hes\CSCI-71\project\medical interchange\public\images\5658E561213CB2C41000006

新路径名= C:\\IronKey\\hes\\cscie-71\\project\\medical interchange\\public\\images\\5658E561213CB2C41000006

调用fs.unlink时出错

当我使用DOS shell查找该文件时,它确实存在。我对新路径名做什么也不重要,我永远不能删除该文件。如果我通过注释掉对
normalizedPathName.replace()
的调用而用单反斜杠保留路径,它仍然会失败。但是,如果我手动创建这样的字符串,它可以工作:

取消链接(“c:\\IronKey\\hes\\cscie-71\\project\\medical interchange\\public\\images\\5658E561213CB2C41000006”, 函数(err){

我要怎么做才能删除这个文件?我完全被难住了

我按照josh3736的建议修改了代码,如下所示,但我得到了一个eNot错误。该文件显然存在,因为我使用错误消息中报告的完整路径名在编辑器中打开了它:

        // check if this item has an uploaded image file
        var imageFullPathName = path.join(__dirname, "../public/images",
                                          sanitize(req.params.itemId));
        logger.log("imageFullPathName = " + imageFullPathName);

        fs.unlink(imageFullPathName, function(err){
            //if (err.code != 'ENOENT'){
            if (err){
                logger.log("Error in call to fs.unlink", err);
            }
            else{
                logger.log("No file found");
            }
            logger.log("Delete Success");
        });
错误信息如下所示:
调用fs.unlink时出错{[Error:enoint:没有这样的文件或目录,取消链接'C:\\IronKey\\hes\\cscie-71\\project\\medical interchange\\public\\images\\5658fd27fca1b3dbc3d0000e']

这里有几个问题

  • 您盲目信任用户输入。攻击者只需请求一个URL,其
    itemId
    设置为
    %2E%2E%2F%2E%2E%2F%2E%2E%2F Windows
    。Express将在
    req.params
    中取消此功能。/../Windows,然后您的服务器就消失了

    一般来说,在处理不受信任的输入时要特别小心(通过HTTP输入的任何内容都是不受信任的)

  • fs.exists
    是一种反模式。在调用
    exists
    和下一步执行的任何操作之间,其他一些进程可能会添加或删除有问题的文件。相反,请无条件地调用
    unlink
    ——如果您遇到
    err.code='enoint'错误,则该文件不存在;忽略该错误即可

  • 为什么
    normalizedPathName=normalizedPathName.replace(/\\/g,“\\\\\”)
    ?您有一个有效的路径,正在使其无效(
    C:\foo\bar
    → <代码>C:\\foo\\bar
    ),所以它当然不起作用

  • 组装路径时,请使用
    path.join
    ,而不是字符串连接。它将处理斜杠(
    \
    vs
    /
    ),使代码可移植

  • 综上所述

    var imageFullPathName = path.join(
                                        __dirname,
                                        "../public/images",
                                        sanitizeFilename(req.params.itemId)
                                    );
    
    fs.unlink(imageFullPathName, function(err){
        if (err) {
            if (err.code != 'ENOENT') {
                // handle actual errors here
                console.error("Error in call to fs.unlink", err);
            }
            // else there was no file, handle that if you need to
        }
        // else delete success, handle that if you need to
    });
    

    由于您提到您的代码即使在注释掉反斜杠
    replace
    行时也会失败:


    您的代码应该是这样工作的。实际错误是什么?我的第一个猜测是权限问题。

    为什么要使用一个版本的
    normalizedPathName
    来执行
    fs.exists()
    ,然后在删除之前尝试更改它?另外,
    fs.exists()
    是一种反模式。只要尝试删除并处理一个不存在的错误即可。我对javascript和node非常陌生。请您解释一下“反模式”的含义好吗?现在回答您的问题:fs.exists()调用使用传递它的路径。对fs.unlink()的调用失败,我试图找到一种方法使其工作。实际上没有其他原因。反模式意味着“做事情的糟糕方式”。您需要停止更改路径,只需在所需路径上调用
    fs.unlink()
    ,而不使用
    fs.exists()
    调用。如果不起作用,请查看返回的错误并使用该错误进行诊断。
    fs.exists()
    由于并发问题而被弃用。在多任务操作系统中,可以在调用
    fs.exists()
    和调用
    fs.unlink()之间删除该文件
    通过其他进程。并且,如果文件不存在,您只需调用
    fs.unlink()
    并处理错误。
    fs.exists()没有任何原因
    call。感谢您的解释!当我使用上面错误消息中报告的确切路径名在编辑器中打开该文件时,该文件确实存在。我在上面的原始问题中包含了修改后的代码和完整的错误消息,因为我没有足够的字符在注释中这样做。下面是错误:cal中的错误l到fs.unlink{[Error:enoint:没有这样的文件或目录,取消链接'C:\\IronKey\\hes\\cscie-71\\project\\medical interchange\\public\\images\\5658fd27fca1b‌​3bc3d00000e']奇怪的是,错误代码有双反斜杠,而实际的文件名没有。下面是记录imageFullPathName的输出:imageFullPathName=C:\IronKey\hes\CSCI-71\project\medical interchange\public\images\5658FD27FCA1B3BC3D00000。在其他注释中,我稍微修改了代码,以便通过remov确定错误ing“!=enoint”。