Não é possível ler arquivo no Windows devido a problema de escape

Descreva o problema/erro/pergunta

Estou tentando ler um arquivo txt em um servidor Windows, mas ele tem dificuldade em ler de uma pasta se contém colchetes ou outros caracteres especiais. Então, para corrigir isso, preciso escapar os colchetes, mas por alguma razão estranha o n8n está substituindo barra invertida por barra normal. Alguém sabe como corrigir isso?

Qual é a mensagem de erro (se houver)?

Como você pode ver na entrada, escapei os colchetes com uma barra invertida, mas na saída você vê que os colchetes têm uma barra normal

Por favor, compartilhe seu workflow

Compartilhe a saída retornada pelo último nó

Informações sobre sua configuração n8n

  • Versão n8n: 2.19.5
  • Banco de dados (padrão: SQLite): padrão
  • Configuração n8n EXECUTIONS_PROCESS (padrão: próprio, principal): padrão
  • Executando n8n via (Docker, npm, n8n cloud, aplicativo desktop): npm
  • Sistema operacional: Windows Server 2022

@Ruriko
Uma solução simples é mover ou copiar o arquivo para um caminho sem colchetes ou caracteres especiais, como C:\n8n-files\input.txt, e fazer com que o n8n leia desse caminho sanitizado.

O motivo pelo qual isso está acontecendo é porque o n8n processa o caminho como uma string e normaliza barras. Essa é uma quirk conhecida ao executar n8n no Windows. Mover o arquivo para uma pasta diferente ajudaria, mas aqui está o que você pode tentar em vez disso:

-Use barras invertidas duplas para escapar algo como, “C:\\pasta (com colchetes)\\arquivo.txt”. A primeira barra invertida faz o escape, o que significa que a segunda sobrevive ao processamento de string.

-Coloque o caminho em uma expressão usando ‘$json’ ou um nó Set para construí-lo, em vez de digitar diretamente no campo, isso às vezes pode contornar a normalização.

-Se você estiver auto-hospedando, usar um caminho UNC (‘\\\\servidor\\compartilhamento\\pasta’) às vezes pode evitar o problema.

Com qual nó você está lendo o arquivo? Isso ajudará a estreitar a questão.

No meu fluxo de trabalho, já tentei colocar o caminho em uma expressão e não funcionou. Estou usando o nó Read/Write para ler o arquivo. A questão é que na versão 1.x funcionava, mas ao migrar para a 2.x não funciona mais porque está substituindo a barra invertida pela barra normal.

@Ruriko sua expressão Edit Fields1 chama .replaceAll(‘\’,‘/’) primeiro — você está convertendo barras invertidas, não n8n. Remova o replace e apenas escape os colchetes, ou use barras normais em todo o lugar já que readWriteFile as aceita no Windows.

Oi @Ruriko, ótimo que você tenha compartilhado a captura de tela do fluxo - isso facilita muito o entendimento!

Este é um comportamento conhecido ao construir caminhos em expressões n8n no Windows. O motor de expressão trata a barra invertida como um caractere de escape, então \[ é normalizado para /[ ou removido.

A solução mais limpa é construir o caminho em um nó Code (não em uma expressão) onde você tem controle total de JavaScript:

const folderName = $('Edit Fields').item.json.folderName; // sua entrada
const safePath = 'C:\\Users\\Admin\\Desktop\\' + folderName;
// ou use String.raw se o nome da pasta vem de uma entrada:
const filePath = String.raw`C:\Users\Admin\Desktop\` + folderName;

return [{ json: { filePath } }];

Depois use {{ $json.filePath }} no seu nó Read/Write Files.

Alternativamente, se você quiser manter a abordagem de expressão, pode substituir barras normais por barras invertidas dentro da expressão:

{{ $json.path.replace(/\//g, '\\') }}

O exemplo de fluxo de @achamm funcionou para você? Se você conseguir compartilhar qual é o valor do caminho atual após o nó Edit Fields, podemos identificar exatamente onde a substituição de barra está acontecendo.

Oi @Ruriko :waving_hand:
Obrigado por compartilhar esse problema de caminho do Windows muito interessante.

Uma coisa que pode ajudar é construir o caminho final em um nó Code usando path.join() em vez de escapar manualmente a string em expressões. Como o nó Code do n8n é executado no runtime do Node.js: essa pode ser uma forma mais limpa de normalizar separadores e manter a construção do caminho determinística.

Por exemplo:

const path = require('path');

const finalPath = path.join(
  'C:\\Users\\user1',
  '[project]',
  'input.txt'
);

return [{ json: { finalPath } }];

Então você pode passar {{$json.finalPath}} para o nó de arquivo.

Na minha opinião, isso geralmente é mais seguro do que lutar contra o escape de barra invertida passo a passo em expressões.

Adicione uma barra invertida antes de cada colchete quadrado diretamente no campo File(s) Selector:
\[A+B\]/file.txt
C:/Users/Administrator/Desktop/Data/Test \[A+B\]/file.txt

ou Use .replaceAll() em uma expressão

Se o caminho vem de uma expressão dinâmica (por exemplo, de um nó anterior), use .replaceAll() para escapar os caracteres especiais programaticamente

{{$json.path.replace(‘[’, ‘\[’).replaceAll(‘]’, ‘\]’).replaceAll(‘{’, ‘\{’).replaceAll(‘}’, ‘\}’)}}