none
É possível passar um Arquivo em um site para um FILEINFO ? RRS feed

  • Pergunta

  • Boa tarde ! 

    Estou com o seguinte problema , quero fazer download de um arquivo  específico dentro de um diretório FTP segue o caminho do arquivo "ftp://ftp.symantec.com/public/english_us_canada/antivirus_definitions/norton_antivirus/" . Porém preciso abrir esse arquivo dentro de um FILEINFO , quando jogo este caminho junto com o nome do arquivo que atende minhas regras , ele gera uma EXCEPTION Additional information: Não há suporte para o formato do caminho dado.

    Ou seja , é possível eu passar essa caminho pra ter esse arquivo dentro de um FILEINFO ? Se sim , como fazer ? 

    sexta-feira, 7 de novembro de 2014 18:19

Respostas

  • As classes de IO não dá suporte para caminhos via FTP. Pode fazer algo assim para listar os arquivos do FTP em uma listview, por ex.:

    Para listar os arquivos:

    public static IEnumerable<string> GetFilesInFtpDirectory(string url, string username, string password)
    {
        // Get the object used to communicate with the server.
        var request = (FtpWebRequest)WebRequest.Create(url);
        request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        request.Credentials = new NetworkCredential(username,password);
    
        using (var response = (FtpWebResponse) request.GetResponse())
        {
            using (var responseStream = response.GetResponseStream())
            {
                var reader = new StreamReader(responseStream);
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    if (string.IsNullOrWhiteSpace(line) == false)
                    {
                        yield return line.Split(new[] { ' ', '\t' }).Last();    
                    }
                }
            }
        }
    }

    Para adicionar na ListView

    ListView1.Items.Clear();
    
        string[] files = GetFilesInFtpDirectory(ftp, usuario, senha);
        foreach (string file in files)
        {
    
            string fileName = Path.GetFileNameWithoutExtension(file);
            ListViewItem item = new ListViewItem(fileName);
            item.Tag = file;
    
            ListView1.Items.Add(item);
    
        }

    Se você precisar dessa informações do arquivo com FileInfo poderá baixá-lo para sua máquina local e então usar o FileInfo:

    //Cria comunicação com o servidor
    //definindo o arquivo para download
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://servidor.com.br/images/logo.png");
    //Define que a ação vai ser de download
    request.Method = WebRequestMethods.Ftp.DownloadFile;
    //Credenciais para o login (usuario, senha)
    request.Credentials = new NetworkCredential("usuario", "senha");
    //modo passivo
    request.UsePassive = true;
    //dados binarios
    request.UseBinary = true;
    //setar o KeepAlive para true
    request.KeepAlive = true;
    
    //criando o objeto FtpWebResponse
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    //Criando a Stream para ler o arquivo
    Stream responseStream = response.GetResponseStream();
    
    byte[] buffer = new byte[2048];
    
    //Definir o local onde o arquivo será criado.
    FileStream newFile = new FileStream("c:\\wwwroot\\exemplos\\logo.png", FileMode.Create);
    //Ler o arquivo de origem
    int readCount = responseStream.Read(buffer, 0, buffer.Length);
    while (readCount > 0)
    {
    	//Escrever o arquivo
    	newFile.Write(buffer, 0, readCount);
    	readCount = responseStream.Read(buffer, 0, buffer.Length);
    }
    newFile.Close();
    responseStream.Close();
    response.Close();

    Marque como resposta se foi útil, por favor!


    sexta-feira, 7 de novembro de 2014 18:43
  • Olá, de forma nativa, não.A classe FileInfo só tem todas as propriedades preenchidas se estiver lendo de um arquivo local (já que parte delas é do tipo string e utiliza apenas Substring para obter informações).

    O que pode ser feito é baixar o arquivo e instanciar um novo objeto do tipo FileInfo para o caminho do arquivo (já baixado).

    sexta-feira, 7 de novembro de 2014 18:56

Todas as Respostas

  • As classes de IO não dá suporte para caminhos via FTP. Pode fazer algo assim para listar os arquivos do FTP em uma listview, por ex.:

    Para listar os arquivos:

    public static IEnumerable<string> GetFilesInFtpDirectory(string url, string username, string password)
    {
        // Get the object used to communicate with the server.
        var request = (FtpWebRequest)WebRequest.Create(url);
        request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        request.Credentials = new NetworkCredential(username,password);
    
        using (var response = (FtpWebResponse) request.GetResponse())
        {
            using (var responseStream = response.GetResponseStream())
            {
                var reader = new StreamReader(responseStream);
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    if (string.IsNullOrWhiteSpace(line) == false)
                    {
                        yield return line.Split(new[] { ' ', '\t' }).Last();    
                    }
                }
            }
        }
    }

    Para adicionar na ListView

    ListView1.Items.Clear();
    
        string[] files = GetFilesInFtpDirectory(ftp, usuario, senha);
        foreach (string file in files)
        {
    
            string fileName = Path.GetFileNameWithoutExtension(file);
            ListViewItem item = new ListViewItem(fileName);
            item.Tag = file;
    
            ListView1.Items.Add(item);
    
        }

    Se você precisar dessa informações do arquivo com FileInfo poderá baixá-lo para sua máquina local e então usar o FileInfo:

    //Cria comunicação com o servidor
    //definindo o arquivo para download
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://servidor.com.br/images/logo.png");
    //Define que a ação vai ser de download
    request.Method = WebRequestMethods.Ftp.DownloadFile;
    //Credenciais para o login (usuario, senha)
    request.Credentials = new NetworkCredential("usuario", "senha");
    //modo passivo
    request.UsePassive = true;
    //dados binarios
    request.UseBinary = true;
    //setar o KeepAlive para true
    request.KeepAlive = true;
    
    //criando o objeto FtpWebResponse
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    //Criando a Stream para ler o arquivo
    Stream responseStream = response.GetResponseStream();
    
    byte[] buffer = new byte[2048];
    
    //Definir o local onde o arquivo será criado.
    FileStream newFile = new FileStream("c:\\wwwroot\\exemplos\\logo.png", FileMode.Create);
    //Ler o arquivo de origem
    int readCount = responseStream.Read(buffer, 0, buffer.Length);
    while (readCount > 0)
    {
    	//Escrever o arquivo
    	newFile.Write(buffer, 0, readCount);
    	readCount = responseStream.Read(buffer, 0, buffer.Length);
    }
    newFile.Close();
    responseStream.Close();
    response.Close();

    Marque como resposta se foi útil, por favor!


    sexta-feira, 7 de novembro de 2014 18:43
  • Olá, de forma nativa, não.A classe FileInfo só tem todas as propriedades preenchidas se estiver lendo de um arquivo local (já que parte delas é do tipo string e utiliza apenas Substring para obter informações).

    O que pode ser feito é baixar o arquivo e instanciar um novo objeto do tipo FileInfo para o caminho do arquivo (já baixado).

    sexta-feira, 7 de novembro de 2014 18:56