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

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
 
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!
 
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.
 
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


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim Result As Long
Dim theNetResource As NETRESOURCE
theNetResource.dwType = RESOURCETYPE_DISK
theNetResource.lpRemoteName = "\\o_meu_servidor_remoto"
theNetResource.lpLocalName = "X:"
Result = WNetAddConnection2(theNetResource, "a_minha_password", "o_meu_utilizador", CONNECT_UPDATE_PROFILE)
End Sub

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.
 
SkylineGTR, muito obrigado pela tua resposta, mas será que me podes dar uma ajuda com o código? Perdi-me completamente, é que como podes ver não tenho grande experiência.

Crias uma classe com isto, ou está tudo em algum evento, no On Load ?

Se preferires podes usar o meu mail. [email protected]

Obrigado.


 
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
 
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
 
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:

Public Declare Auto Function WNetCancelConnection2 Lib "mpr.dll" (ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Boolean) As Integer

Podes ajudar?

Obrigado.
 
Última edição:
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)
 
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
 
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)
 
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:
1) abres a conexão (WNetAddConnection2)
2) fechas a conexão (WNetCancelConnection2 )
3) Tentas ler o ficheiro
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
 
Back
Topo