PEgar o diretorio de uma class library

.NET

14/01/2013

Bom dia,

Estou co um projeto onde há uma class library responsavel pelo acesso ao banco (SQLite) e é o ponto comum entre 2 projetos que precisam compartilhar o mesmo arquivo de configuração (SQLite).

Portanto eu queria deixar o arquivo sqlite dentro da pasta bin\debug dessa class library.

String programa = Assembly.GetExecutingAssembly().Location;
      String pastaSistema = programa.Substring(0, programa.LastIndexOf('\\'));
      conn = new SQLiteConnection(@"data source="+ pastaSistema + @"\BancoConfiguracao.s3db");


Porem quando eu faço isso ele pega a pasta Debug da aplicação e não da class library...
Qualquer ajuda é bem vinda, obrigado
Gustavo Henrique

Gustavo Henrique

Curtidas 0

Respostas

Robson Alves

Robson Alves

14/01/2013

Gustavo!
Fiz algumas pesquisas, todos elas traz o endereço da aplicação onde o sistema estará compilado!

Pensando no processo de como tudo funciona, é o mais correto!

Imagina que o path da pasta Bin/Debug exista apenas para a aplicação em desenvolvimento.
No release, é gerado uma DLL e ela ficará na pasta do Sistema (Web/WinForm)...
Então coloque o SQLLite dentro da Bin/Debug do projeto e não do ClassLibrary!

Deve existir uma forma de trazer o que vc precisa (não estou limitando seu problema).
Mas vejo que isso será conceitualmente errado.
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

Robson,

O problema de ir na pasta bin da aplicação é que são 2 projetos, cada um irá acessar dentro da pasta bin dele, se eu colocar o banco dentro da bin da aplicação de um projeto o outro não irá achar o arquivo, por isso pensei em colocar dentro da class library que é o unico ponto comum entre ambos.
É um windows service que acessa o banco com as configurações, uma aplicação onde se pode manipular essas configurações, e uma class library que faz o acesso de ambas aplicações. Se você tiver alguma sugestão pra me dar de onde colocar o banco em algum ponto onde todos terão acesso e que fique independente de onde esta o projeto, ou alguma sugestão de mudança, faço facu mas trabalhar com programação mesmo comecei por esses dias ;x
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Legal Gustavo, seja bem vindo a área :D

Bem cara, o que eu fiz aqui e acredito que resolva seu problema.

Primeiro criei uma pasta BD na classLibrary.
depois fiz o seguinte código:


 if (Directory.Exists("BD"))
            {
                foreach (var fileDirectory in Directory.GetFiles("BD", "*.db"))
                {
                    SqlConnection con = new SqlConnection(string.Format("Data Source=;Version=3;Password=myPassword;", new FileInfo(fileDirectory).DirectoryName + fileDirectory));
                    try
                    {
                        con.Open();
                    }
                    catch (Exception)
                    {

                        throw;
                    }
                    finally
                    {
                        con.Close();
                    }
                }
            }



Ele verifica se encontrou a pasta BD, depois ele pega os arquivos dessa pasta, filtrando todos com a extensão .BD (sabemos que é só um, e isso pode ser refeito). Depois eu pego pelo arquivo o caminho físico dele e o endereço "Virtual" dele.

Assim o Programa é capaz de abrir a conexão!

Fiz aqui e deu certo (utilizei SQL Server Local) não utilizei o SQlite, mas é a mesma coisa!

Happy Coding.
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

Robson,

Entendi a idéia, mas modifiquei aqui de acordo com o SQLite, mas mesmo assim não deu, realizei um debug, e ele ta passando direto pelo if

if (Directory.Exists("BD"))

Ele procura a partir de onde essa pasta BD? Isso não entendi muito bem, geralmente se passa algum caminho desde a raiz.

Coloquei depois de todo código que você me passou os seguintes comandos:

 comando = new SQLiteCommand();
       comando.Connection = conn;
       pasta = conn.ConnectionString.ToString();


pasta é uma string publica que só serve pra mim ver qual era a string de conexão que retornava para saber se estava tudo ok, mas quando ele vai atribuir a conexão ao comando, ele da um erro dizendo que a conexão é nula, justamente por pular todo o bloco do if..
Enfim, hoje na empresa iremos testar aqui, por enquanto deixar o BD em algum caminho constante mesmo, mas vou sempre que tiver um tempo dar uma fuçada nisso, se caso eu descobrir a resposta eu postarei ela aqui.
Obrigado pela ajuda Robson, qualquer novidade coloque ai por favor que estarei sempre de olho no tópico!
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Como BD é uma pasta dentro da ClassLibrary, ele teoricamente está no mesmo diretório do que está procurando.. portanto não preciso definir onde ele está (caminho total), ele vai ser encontrado!

O código que eu te passei é pra ser incluído dentro da class library!
pois essa camada é quem chamará o BD!

Vc colocou esse código nessa camada?

Estranho.. !
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

Robson,

Fiz assim [url]http://pastebin.com/XdPypNM7[/url] (Aqui o código é melhor pra analisar)

Tem todo o código da classe, deve ter uns códigos repetidos ae, mas isso é falta de experiência um pouco, rs.
Criei a pasta BD dentro do \bin\debug da class library, e coloquei o banco sqlite dentro dela, e mesmo assim não esta indo.
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Ok, o problema é justamente onde vc está criando a pasta.

Crie a pasta dentro do projeto da ClassLibrary, não na pasta Bin/Debug.

Então toda vez que forem utilizar o classlibrary o mesmo irá acessar a base dados única!
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Infelizmente minha empresa bloqueia um monte de links ... o postebin é um deles
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

public DAO()
        {
            if (Directory.Exists("BD"))
            {
                foreach (var fileDirectory in Directory.GetFiles("BD", "*.s3db"))
                {
                    conn = new SQLiteConnection(string.Format("Data Source=;", new FileInfo(fileDirectory).DirectoryName + fileDirectory));
                    try
                    {
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            pasta = conn.ConnectionString;
            comando = new SQLiteCommand();
            comando.Connection = conn;
}


To utilizando no Construtor o código, criei a pasta BD na mesma pasta do projeto, onde fica a bin, obj e properties..
E mesmo assim não foi. ;/
Tentar depois do almoço mostrar pra turma que manja aqui, ve se alguem tem uma solução
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Ok, o problema é justamente onde vc está criando a pasta.

Crie a pasta dentro do projeto da ClassLibrary, não na pasta Bin/Debug.

Então toda vez que forem utilizar o classlibrary o mesmo irá acessar a base dados única!


Você viu essa minha citação?
Não crie a pasta BD dentro de Bin, crie no próprio projeto da ClassLibrary!
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

Botão direito no projeto add new folder...
Nada tambem ;x
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Não creio :/ Ele diz que pasta não existe certo?

No Debug, tenta jogar outros endereços até que ele encontre o BD ... o Caminho é esse!

GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

DirectoryNotFound...

Could not find a part of the path 'C:\Documents and Settings\gustavo.henrique\Meus documentos\ProjetoSVNBKP\Interface_SVNBackup\Interface_SVNBackup\bin\Debug\Banco\'.

Ta dando esse erro, por isso anteriormente tentei colocar na pasta Debug, mas sem sucesso tbm!
To tentando, qualquer novidade eu posto!
Obrigado
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Sim, ele pega a pasta Bin,mas ele vai encontrar a pasta dentro do projeto !

So falta um detalhe no caminho que é o nome do arquivo.

Ve se a variavel FileDirectory está capturando algum valor!
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

Ele esta com o valor null
Ah e eu alterei o nome de BD pra Banco.
Isso ai já me retorna a pasta que eu criei no projeto? ou tem algum outro jeito de acessar essa pasta criada?
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Se alterou o nome da pasta tem que alterar no código!

essa é a extensão correta do arquivo de banco SQLite *.s3db ?

Enquanto o FileDirectory retornar null, quer dizer que não tem nenhum arquivo com essa extensão dentro da pasta!

Estamos quase lá.


Se não entrar no If, quer dizer q nem encontrou a pasta.
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

Então ele nem entra no if.

if (Directory.Exists("Banco"))


Sim, o SQLite gera um arquivo com essa extensão
Amanhã cedo eu volto a tentar novamente, pegar o caminho de casa agora!
Obrigado pela ajuda Robson, qualquer novidade amanhã eu já posto!
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Opa! Boa viajem e descanso ;) (minha jornada ainda vai até mais tarde)
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

Robson,

Veja isso

            string file = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath;
            FileInfo fi = new FileInfo(file);
            string conexao = fi.DirectoryName;
            conexao += @"\Banco\BancoConfiguracao.s3db";


Ele pega o endereço da DLL da class library, depois pega apenas o nome do diretorio onde esta a dll (ele vai até bin\debug)
depois eu coloquei o nome da pasta do banco e o banco! Vou testar aqui e posto o resultado, mas debugando foi de boa!!

=D
GOSTEI 0
Gustavo Henrique

Gustavo Henrique

14/01/2013

Me enganei, ele ainda continua pegando a DLL que foi gerada na aplicação e não na dll da class library :/
Passei o dia todo fuçando isso e nada, estou quase desistindo!!!
GOSTEI 0
Robson Alves

Robson Alves

14/01/2013

Puxa, não consigo entender como não está conseguindo, nos meus testes, ele lê os arquivos da pasta e em seguida cria a conexão com o banco de dados, sem problemas! :/
GOSTEI 0
POSTAR