1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Vb.NET 2005 Ajuda em aceder ao um ficheiro texto na rede

Discussão em 'Programação' iniciada por slowman, 29 de Janeiro de 2008. (Respostas: 11; Visualizações: 1224)

  1. slowman

    slowman Power Member

    Olá viva.

    Será que me podem dar umas luzes aqui num probleminha numa aplicação vb. O que pretendo é ler um ficheiro texto simples mas que está num pc em rede. Quando tento criar uma StramReader eu posso colocar o ip, mas se o pc precisar de login obtenho um erro de acesso ao ficheiro.

    Como posso fazer login (sabendo o user e password como é óbvio), para aceder ao ficheiro?

    O meu muito obrigado em avanço.

    Cumps
     
  2. mOrSa

    mOrSa Power Member

    Ora bem... assim uma ideia meia malukes... Monta uma drive "virtual" no PC onde tens a pasta com o ficheiro partilhado o que faz com que o a unidade fique visível para o .NET (penso eu de que). Tenta, posteriormente, aceder ao ficheiro "localmente".
    Nota: se tens problema de autenticação (necessidade) podes sempre encriptar o ficheiro!

    Espero que, pelo menos, dê pra safar!

    1abraço!
     
  3. slowman

    slowman Power Member

    mOrSa, não entendi bem a tua solução e sim parece bem maluca mas agradeço o esforço.

    Para se entender melhor o meu prob. aqui vai: eu crio um StreamReader com o endereço do ficheiro (em string) onde posso meter o endereço ip e o resto do endereço até ao ficheiro texto. O que acontece é que ao tentar ler o ficheiro dá-me um erro reportando "nome de utilizador desconhecido ou palavra-passe incorrecta", o que não acontece se tentar aceder ao mesmo ficheiro localmente (onde na string do endereço do ficheiro não entra o ip da máquina como é óbvio).

    Será que é possivel incluir o user e a pass no StreamReader? Será que tenho que criar algum socket? Alguma ideia como posso fazer isso? Ou será que funciona com um httpRequest?

    Qualquer ajuda é muito bem vinda.

    Cumps.
     
  4. SkylineGTR

    SkylineGTR Power Member

    Deixo-te aqui o código que usei quando necessitei de guardar e abrir ficheiros num PC remoto:

    Código:
    [SIZE=2][COLOR=#0000ff][COLOR=#ffffff]Imports System.IO[/COLOR][/COLOR][/SIZE]
    [COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Imports System.Runtime.InteropServices[/COLOR][/SIZE][/COLOR]
     
    
    Código:
    Structure NETRESOURCE
            Public dwScope As Int32
            Public dwType As Int32
            Public dwDisplayType As Int32
            Public dwUsage As Int32
            Public lpLocalName As String
            Public lpRemoteName As String
            Public lpComment As String
            Public lpProvider As String
        End Structure
     
        Public Const NO_ERROR As Int32 = 0
        Public Const CONNECT_UPDATE_PROFILE As Int32 = &H1
        Public Const RESOURCETYPE_DISK As Int32 = &H1
     
        Declare Function WNetAddConnection2 Lib "mpr.dll" Alias _
          "WNetAddConnection2A" (ByRef lpNetResource As NETRESOURCE, _
          <MarshalAs(UnmanagedType.LPStr)> ByVal lpPassword As String, <MarshalAs(UnmanagedType.LPStr)> ByVal lpUserName As String, _
          ByVal dwFlags As Int32) As Int32
     
        Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias _
        "WNetCancelConnection2A" (ByVal lpName As String, _
        ByVal dwFlags As Long, ByVal fForce As Long) As Long

    Só tens de alterar essencialmente a parte que está no evento LOAD, no que diz respeito ao endereço do servidor, username (tem atenção ao dominio) e password.
    Podes evidentemente adaptar este código ao teu e fazer correcções se necessário.
     
  5. SkylineGTR

    SkylineGTR Power Member

    Podes fazer como quiseres, mas de uma maneira simples podes colocar na página onde vais ler o tal ficheiro.

    Eu dividi o código em 3.

    O 1º bloco penso que não é preciso explicar. Só tens de colocar aqueles 2 imports junto dos restantes que já deves ter.

    O 2º bloco não tens que alterar nada. Copias e colas abaixo do ínicio da tua classe.

    O 3º bloco colocas em qualquer lado, desde que seja feito antes da tentativa de abertura do ficheiro na outra máquina. Podes colocar imediatamente antes disso, ou colocar logo no evento load do teu form. E só tens de alterar o que coloquei a vermelho (podes também alterar o lpLocalName).

    mais info:

    http://msdn2.microsoft.com/en-us/library/aa385413(VS.85).aspx
     
  6. slowman

    slowman Power Member

    SkylineGTR, és o maior. Tá feito.

    Na realidade tenho pena de não ter percebido muito do código o que me fez sentir um bocado.... como ei-de dizer.... Burro.

    Vou tentar estudar melhor a função WNetAddConnection2, mas o que interessa é que a minha classe tá a bombar.

    Obrigado.

    Cumps
     
  7. slowman

    slowman Power Member

    SkylineGTR desculpa insistir, mas uma vez que consegui a ligação gostaria de a terminar (como faz sentido). Infelizmente não tou a conseguir. Estou a usar o seguinte código:

    Result = WNetCancelConnection2("", CONNECT_UPDATE_PROFILE, True) e está a retornar o erro 87. E não entendo porque. Pesquisando tentei também alterar a chamada da função (até porque me estava a dar o warning estranho) por esta:

    Podes ajudar?

    Obrigado.
     
    Última edição: 31 de Janeiro de 2008
  8. SkylineGTR

    SkylineGTR Power Member

    Desculpa lá, mas ontem de tarde estive em clientes e não pude vir aqui.

    Experimenta isto:

    Código:
    Dim Result As Long
    Result = WNetCancelConnection2([COLOR=#ff0000]"[/COLOR][URL="file://o_meu_servidor_remoto/"][COLOR=#ff0000]\\o_meu_servidor_remoto[/COLOR][/URL][COLOR=#ff0000]"[/COLOR], 0, True)
    
     
  9. slowman

    slowman Power Member

    SkylineGTR mais uma vez obrigado.

    Realmente desse modo obtenho um Resultado de "0" que me parece o correcto embora fique com algumas dúvidas. Paço a explicar:

    - Estou a testar o código com um servidor aqui da rede e onde no meu desktop tenho um atalho para a pasta onde contenho o ficheiro de onde quero sacar a informação. O que acontecia antes de correr o código era se eu clicasse no atalho, uma janela para fazer login (uma vez feito nunca mais fica necessário). Sem introduzir o login e password corri o código, sem erros, e de seguida (também por curiosidade) fui clicar no atalho e pimba, nada de login, ou seja, o programa funcionou na perfeição e conseguiu fazer login.
    Agora testei fechar a ligação (o que aconteceu graças a ti sem erros) mas experimentando pelo atalho não me pede o login. Depreendo disso que a ligação continua activa? Achas que sim?

    Cumps
     
  10. SkylineGTR

    SkylineGTR Power Member

    Não sei como está estruturado o teu código, mas testa algo como isto:

    Cenário de teste:

    1) abres a conecção (WNetAddConnection2)
    2) fechas a conecção (WNetCancelConnection2 )
    3) Tentas ler o ficheiro

    Se consegiu ler o ficheiro é porque o WNetCancelConnection2 não fechou a ligação. Se te devolver o erro é porque fechou.


    Isto tendo em conta que o cenário correcto é algo como isto:

    1) abres a conecção (WNetAddConnection2)
    2) Lês o ficheiro
    3) fechas a conecção (WNetCancelConnection2 )


    IMPORTANTE
    Pelo que estive a ler no MSDN tens de usar o CONNECT_UPDATE_PROFILE como segundo parametro do WNetCancelConnection2, para que a conecção não se mantenha como persistente.

    Usa isto:

    Código:
    Dim Result As Long
    Result = WNetCancelConnection2([COLOR=#ff0000]"[/COLOR][URL="file://o_meu_servidor_remoto/"][COLOR=#ff0000]\\o_meu_servidor_remoto[/COLOR][/URL][COLOR=#ff0000]"[/COLOR], CONNECT_UPDATE_PROFILE, True)
     
  11. slowman

    slowman Power Member

    Bom por onde começar.

    1º substitui directamente o teu código final e obtive a mesma coisa, ou seja, obtive 0 nos dois resultados o que me parece ser o resultado mas indo ver ao atalho para o servidor a ligação está aberta.

    Fazendo o que disses-te:
    obtive o mesmo, mas depois tive uma ideia. Reiniciar o pc e começar de novo.

    Depois de reiniciar e fazer o teste em cima citado, verifiquei que sim está a funcionar porque me deu erro de leitura do ficheiro. Fiz mais alguns testes e realmente funciona. A grande questão está e não percebo porque foi depois de experimentar isso e reparar que se abrir a ligação e fechar, clicando no atalho ele abre a pasta sem pedir login e a partir desse momento não preciso mais abrir a ligação e fechar que correndo o código ele consegue ler o ficheiro.

    Penso com isto que o Sistema Operativo detecta a ultima ligação e a deixa aberta. Não sei algo do género.

    De qualquer forma muito obrigado.

    Cumps
     

Partilhar esta Página