为什么使用 Atom 的“remote-ftp”时无法删除文件

为什么使用 Atom 的“remote-ftp”时无法删除文件

我可以创建一个文件,但不能remote-ftp用 Atom(icetee 版本 2.2.4)删除它。

这不是权限问题,因为我已经user:group对文件及其父目录的完全所有权进行了测试。

该问题与权限无关的额外证据是,我可以使用第三方软件(如 FileZilla),并且它将能够删除该文件(相同的 sFTP 凭据)。

我在多个 VPS 服务器上都遇到了这个问题 - 所以我认为我一直在.ftpconfig错误地配置文件,或者这是模块中的错误remote-ftp?似乎没有人报告过这个问题,所以这可能都是我的错?这是我的配置文件:

{  
    "protocol": "sftp",
    "host": "IP_ADDRESS",  
    "port": 22,  
    "user": "USERNAME",  
    "pass": "SUPER_SECRET_PASSWORD_GOES_HERE",  
    "promptForPass": false,  
    "remote": "/",  
    "local": "",  
    "agent": "",  
    "privatekey": "",  
    "passphrase": "",  
    "hosthash": "",  
    "ignorehost": true,  
    "connTimeout": 10000,  
    "keepalive": 10000,  
    "keyboardInteractive": false,  
    "keyboardInteractiveForPass": false,  
    "remoteCommand": "",  
    "remoteShell": "",  
    "watch": [],  
    "watchTimeout": 500,  
    "filePermissions":"0644" 
}

答案1

事实证明,该问题与 Atom 有关,与 remote-ftp 包无关。修复已在这里讨论关于 GitHub 上该包的这个问题报告。

报告内容如下:

“因此,Atom 对话框存在一个问题,导致它无法调用启用实际删除的回调。这个问题要到 1.54 版才会得到修补,目前,我使用以下代码在第 279 行编辑了 remote-ftp command.js 文件,然后重新启动了 Atom。这会导致删除操作在没有提示的情况下发生,所以要小心。一旦 1.54 版推出,只需撤消代码即可。”

'remote-ftp:delete-selected': {
      enabled: true,
      command() {
        if (!hasProject()) return;

        const remotes = getRemotes('You need to select a folder first');
        if (remotes === false) return;

        atom.confirm({
          message: 'Are you sure you want to delete the selected item ?',
          detailedMessage: `You are deleting:${remotes.map(view => `\n  ${view.item.remote}`)}`,
          buttons: {
            'Move to Trash': () => {
              remotes.forEach((view) => {
                if (!view) return;

                const dir = Path.dirname(view.item.remote).replace(/\\/g, '/');
                const parent = remoteftp.treeView.resolve(dir);

                client.delete(view.item.remote, (err) => {
                  if (!err && parent) {
                    parent.open();
                  }
                });
              });
            },
            Cancel: null,
          },
        });
      },

'remote-ftp:delete-selected': {
      enabled: true,
      command() {
        if (!hasProject()) return;

        

const remotes = getRemotes('You need to select a folder first');
        if (remotes === false) return;

        remotes.forEach((view) => {
          if (!view) return;

          const dir = Path.dirname(view.item.remote).replace(/\\/g, '/');
          const parent = remoteftp.treeView.resolve(dir);

          client.delete(view.item.remote, (err) => {
            if (!err && parent) {
              parent.open();
            }
          });
        });

        // atom.confirm({
        //   message: 'Are you sure you want to delete the selected item ?',
        //   detailedMessage: `You are deleting:${remotes.map(view => `\n  ${view.item.remote}`)}`,
        //   buttons: {
        //     'Move to Trash': () => {
        //       remotes.forEach((view) => {
        //         if (!view) return;
        // 
        //         const dir = Path.dirname(view.item.remote).replace(/\\/g, '/');
        //         const parent = remoteftp.treeView.resolve(dir);
        // 
        //         client.delete(view.item.remote, (err) => {
        //           if (!err && parent) {
        //             parent.open();
        //           }
        //         });
        //       });
        //     },
        //     Cancel: null,
        //   },
        // });
      },
    },

我能够实施这个临时修复并且它有效。

如果其他人使用它,请小心,因为删除是即时的(没有确认/提示弹出框要求您验证您的操作),并且正如另一个用户建议的那样,当 Atom 1.54.0(或更高版本)发布时,您要记住撤消此编辑。

答案2

对整个块进行注释,没有用,因为它不调用 delete 方法。但有助于指出问题所在。因此请使用这个;请注意添加了一行代码。:

'remote-ftp:delete-selected': {
  enabled: true,
  command() {
    if (!hasProject()) return;

    const remotes = getRemotes('You need to select a folder first');
    if (remotes === false) return;

    // atom.confirm({
    //   message: 'Are you sure you want to delete the selected item ?',
    //   detailedMessage: `You are deleting:${remotes.map(view => `\n  ${view.item.remote}`)}`,
    //   buttons: {
    //     'Move to Trash': () => {
          remotes.map(view => `\n  ${view.item.remote}`);   // remove after bug is fixed
          remotes.forEach((view) => {
            if (!view) return;

            const dir = Path.dirname(view.item.remote).replace(/\\/g, '/');
            const parent = remoteftp.treeView.resolve(dir);

            client.delete(view.item.remote, (err) => {
              if (!err && parent) {
                parent.open();
              }
            });
          });
    //     },
    //     Cancel: null,
    //   },
    // });
  },
},

相关内容