Eu tenho um pacote SSIS destinado a gravar em vários arquivos, que são armazenados como
\\server\MainFolder\DynamicField1\DynamicField2\File.csv
onde as subpastas DynamicField1 e DynamicField2 não existem necessariamente, mas são provenientes da variável i store para ConnectionString.
Quando executo o pacote da minha área de trabalho, recebo a mensagem:
[File [2]] Warning: The system cannot find the path specified.
O erro continua dizendo:
[File [2]] Error: Cannot open the datafile "\\server\folder\abcd\efgh\filename_20190606115901.csv".
Isso parece um bom nome de arquivo.
Tentei substituir as pastas dinâmicas por um traço para que o nome do arquivo ficasse assim:
\\server\folder\abcd - efgh - filename_20190606115901.csv
e isso realmente parecia funcionar. O problema é que haverá centenas de arquivos e seria melhor se eles pudessem ser organizados em dois níveis de subpastas.
Isso significa que não posso criar pastas em tempo real?
Você precisa usar uma Tarefa do Sistema de Arquivos e definir a Operação para Criar Diretório . Passe uma variável do caminho do arquivo sem o nome do arquivo e ele deve criar o diretório.
Consulte este artigo do blog para obter um bom exemplo de criação de pastas a partir de caminhos dinâmicos.
@JonathanFite estava certo, isso exigia o uso de uma tarefa de script.
Além disso, a gravação no destino do Excel exigia o uso de um arquivo de modelo e, em seguida, uma tarefa do sistema de arquivos para copiá-lo diretamente para o recém-criado (se necessário). Vou responder para que haja um conjunto completo de etapas caso alguém venha procurar e tenha as mesmas habilidades mínimas de C# que eu. Eu juntei a maior parte disso de várias fontes, mas nunca vi um exemplo completo do que eu precisava.
Para gravar em um novo destino do Excel dentro de pastas que talvez ainda não existam, são necessárias duas etapas.
Crie a pasta:
Isso requer System.IO, então você precisa adicioná-lo aos NameSpaces na parte superior. Então é só colar:
na região NameSpaces na parte superior. Em seguida, para criar a pasta, caso ela ainda não exista, adicione o abaixo na
public void Main()
área, substituindo o nome da variável pelo que você está passando como nome da pasta.A grande parte deste código C#, é que ele não irá sobrescrever a pasta se ela já existir, que é exatamente o comportamento que eu queria.
Criando o novo arquivo Excel:
Você precisa primeiro criar um arquivo de modelo, com a "tabela" criada e definida. Então, basta carregar o mesmo tipo de dados em um local de arquivo codificado. Depois de carregar uma vez, limpe todos os dados e salve o arquivo em um local seguro. Em seguida, adicione esse local de arquivo a uma nova variável. Esta será a variável de origem para a Tarefa do Sistema de Arquivos.
Agora tudo que você precisa fazer é adicionar o arquivo System Task. Defina o Destino para a variável para a qual você deseja que os arquivos reais sejam, e o arquivo de modelo será copiado automaticamente para o novo local e renomeado de uma só vez. A tarefa deve ser algo como o abaixo:
Na verdade, é um processo bastante simples.