Acesso dbfs em pastas SpecialFolders
Moderador: Moderadores
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Acesso dbfs em pastas SpecialFolders
SpecialFolder a que me refiro são as pastas como C:\Documents and Settings\Pablo César\Meus documentos etc.
No Stru quero adicionar mais uma opção. Que funcione o ContextMenu no Explorer. Isto é, apontando e clicando com o botão direito do mouse sobre um arquivo dbf, possa dar mais uma opção: Stru - Listar. Então o usuário pode listar a estrutura do dbf de dentro do Explorer.
Mas hoje percebi algo muito estranho, se eu possuo um arquivo dbf no SpecialFolder, ele não abre e dá erro, abortando o programa. Então comecei fazer uma série de testes para contornar esse problema. Não sei ainda se é por ser XP e não é por falta de direitos como administrador. Então passo a seguir as tentativas e suponhamos que cPath:="C:\Documents and Settings\Pablo César\Meus documentos\" :
1. Coloquei If !File(cPath+cDbf) e mesmo sabendo que o arquivo dbf está lá, ele retorna como não existente.
2. O engraçado, acho que isto é tema de hackers... hihi, ele aceita o cPath como "C:\DOCUME~1\PABLOC~1\MEUSDO~1", isto é nomes curtos no padrão 8x3. Daí abre/lê normalmente. Também o STRU funciona na linha de comando já posicionado na pasta C:\Documents and Settings\Pablo César\Meus documentos.
3. Tentei obter o ShortPathName e me retorna vazio. Isto é, o sistema não consegue enxergar a pasta que neste caso é um SpecialFolder.
4. Também tentei posicionar-me dentro da pasta na execução do programa. Mas nada.
5. Nem o IsDirectory() funciona, que sempre funcionou bem.
Alguém já passou por isto. Do que eu lembro, já aconteceu com muitos, mas era Clipper. E eu em Clipper sempre coloquei o caminho em modo curto e funcionou sempre mesmo nas SpecialFolders. E agora que o usuário pode selecionar o arquivo mediante o GetFile, se ele selecionar um dbf que está dentro do Meus Documentos não vai funcionar. E não creio que eu consiga copiar esse dbf em outra pasta, pois não é exergado.
Alguém pode me dar uma luz ?
No Stru quero adicionar mais uma opção. Que funcione o ContextMenu no Explorer. Isto é, apontando e clicando com o botão direito do mouse sobre um arquivo dbf, possa dar mais uma opção: Stru - Listar. Então o usuário pode listar a estrutura do dbf de dentro do Explorer.
Mas hoje percebi algo muito estranho, se eu possuo um arquivo dbf no SpecialFolder, ele não abre e dá erro, abortando o programa. Então comecei fazer uma série de testes para contornar esse problema. Não sei ainda se é por ser XP e não é por falta de direitos como administrador. Então passo a seguir as tentativas e suponhamos que cPath:="C:\Documents and Settings\Pablo César\Meus documentos\" :
1. Coloquei If !File(cPath+cDbf) e mesmo sabendo que o arquivo dbf está lá, ele retorna como não existente.
2. O engraçado, acho que isto é tema de hackers... hihi, ele aceita o cPath como "C:\DOCUME~1\PABLOC~1\MEUSDO~1", isto é nomes curtos no padrão 8x3. Daí abre/lê normalmente. Também o STRU funciona na linha de comando já posicionado na pasta C:\Documents and Settings\Pablo César\Meus documentos.
3. Tentei obter o ShortPathName e me retorna vazio. Isto é, o sistema não consegue enxergar a pasta que neste caso é um SpecialFolder.
4. Também tentei posicionar-me dentro da pasta na execução do programa. Mas nada.
5. Nem o IsDirectory() funciona, que sempre funcionou bem.
Alguém já passou por isto. Do que eu lembro, já aconteceu com muitos, mas era Clipper. E eu em Clipper sempre coloquei o caminho em modo curto e funcionou sempre mesmo nas SpecialFolders. E agora que o usuário pode selecionar o arquivo mediante o GetFile, se ele selecionar um dbf que está dentro do Meus Documentos não vai funcionar. E não creio que eu consiga copiar esse dbf em outra pasta, pois não é exergado.
Alguém pode me dar uma luz ?
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Acesso dbfs em pastas SpecialFolders
Amiguinho,
Quanto a colocar uma opção no menu de contexto use minha dica, lembrando que o stru.exe deve estar dentro da pasta %windir%\system32
Execute e confirme.
Quanto a nomes extensos, se voce não tiver uma função ai posso ver uma que uso.
Para chegar a pasta Meus Documentos, pegue a variável ambiental %HOMEPATH% e adicione \Meus Documentos. HOMEPATH traz o caminho da pasta Meus Documentos do usuário ativo.
Quanto a colocar uma opção no menu de contexto use minha dica, lembrando que o stru.exe deve estar dentro da pasta %windir%\system32
Código: Selecionar todos
Windows Registry Editor Version 5.00
;================================================
; \\\\\\\\\\\\\\ Context Menus //////////////
;================================================
;------------------------------------------------------------------------------------------------------------
[HKEY_CLASSES_ROOT\.dbf]
"Content Type"="Text"
@="dbffile"
[HKEY_CLASSES_ROOT\dbffile]
@="Application Extension"
[HKEY_CLASSES_ROOT\dbffile\Shell\Estrutura\command]
@="Stru.EXE \"%1\""
Quanto a nomes extensos, se voce não tiver uma função ai posso ver uma que uso.
Para chegar a pasta Meus Documentos, pegue a variável ambiental %HOMEPATH% e adicione \Meus Documentos. HOMEPATH traz o caminho da pasta Meus Documentos do usuário ativo.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Acesso dbfs em pastas SpecialFolders
Olá Rochinha, obrigado pela sua instrução do Context Menu, gostei. Vou ainda avaliar outras opções e darei um retorno.
Mas pode ser que haja uma função em C que possa interagir com essa SpecialFolder e obter o nome curto através do nome longo. Assim espero.
Sim tem essa forma também quando for versão do Windows XP pra cima. Aprecio a sua dica, mas tem várias formas de obter o caminho do "Meus documentos". A questão é outra Rochinha. Não sei se você já viu o meu aplicativo STRU.exe, vou tentar exemplificar para que você entenda o meu caso. O STRU entre outras funções, lista a estrutura dos dbfs e como disse queria implementar a opção de Context Menu. Mas suponhamos que o usuário tenha um dbf nessa pasta "Meu documentos" e clique com o botão direito e execute o STRU. Até ai tudo bem, mas de dentro do programa ele não dá acesso a esse dbf. Isto é, para o aplicativo, ele não existe, não dá para abrir e nem dá para obter (com aquela função de conversão) o nome curto sequer. Isso porque é um SpecialFolders. Faça um teste ai, coloque um dbf no meus documentos e tente abrir com o path completo e o executável fora da pasta "meus documentos". Você vai ter o mesmo caso meu. Agora se você passar o path completo mas em forma de nome-curto, ai funciona. Estou frustrado com issoPara chegar a pasta Meus Documentos, pegue a variável ambiental %HOMEPATH% e adicione \Meus Documentos. HOMEPATH traz o caminho da pasta Meus Documentos do usuário ativo.
Quanto a isso não há problemas. O próprio HMG possui a função de converter de nomes longos a curtos. Mas como disse o problema é outro.Quanto a nomes extensos, se voce não tiver uma função ai posso ver uma que uso.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Acesso dbfs em pastas SpecialFolders
Amiguinho,
O que voce precisa é descobrir qual o caminho real da pasta virtual, ou seja, o SpecialFolder: Meus Documentos refere-se a qual pasta real?
A partir dela voce usa uma função de encurtamento.
Uso:
LFN2SFN() - Função que transforma nomes longos em curtos.
O que voce precisa é descobrir qual o caminho real da pasta virtual, ou seja, o SpecialFolder: Meus Documentos refere-se a qual pasta real?
A partir dela voce usa uma função de encurtamento.
Código: Selecionar todos
Function GetSpecialFolders( cSpecialFolder )
oSpecialFolderPath := CreateObject( "Wscript.Shell" )
return oSpecialFolderPath:SpecialFolders( cSpecialFolder )
Código: Selecionar todos
...
? LFN2SFN( GetSpecialFolders( "Meus Documentos" ) )
...
Código: Selecionar todos
Function Lfn2Sfn( cDir )
local cBuffer := space(261)
local nLen
nLen := GetShortPathName( cDir, @cBuffer, len(cBuffer) )
return left( cBuffer, nLen )
DLL32 Function GetShortPathName( lpLongPath AS LPSTR,;
lpShortPath AS LPSTR,;
wBufferLen AS DWORD ) AS DWORD ;
PASCAL FROM "GetShortPathNameA" LIB "kernel32.dll"
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Acesso dbfs em pastas SpecialFolders
Amiguinho,
Quanto a conhecer seu aplicativo, digo que sim, inclusive esta dentro de minha pasta UTILS acima da WAPI.
Teste:
Também:
Retorne, pois apenas implementei e não testei. Na verdade implementei aqui no forum para uso futuro.
Quanto a conhecer seu aplicativo, digo que sim, inclusive esta dentro de minha pasta UTILS acima da WAPI.
Teste:
Código: Selecionar todos
? "Desktop: " + GetSpecialFolders("Desktop") , + ;
"MyDocuments: " + GetSpecialFolders("MyDocuments") , + ;
"Startmenu: " + GetSpecialFolders("startmenu") , + ;
"AllUsersDesktop: " + GetSpecialFolders("AllUsersDesktop") , + ;
"AllUsersStartMenu: " + GetSpecialFolders("AllUsersStartMenu") , + ;
"AllUsersPrograms: " + GetSpecialFolders("AllUsersPrograms") , + ;
"AllUsersStartup: " + GetSpecialFolders("AllUsersStartup") , + ;
"Favorites: " + GetSpecialFolders("Favorites") , + ;
"Fonts:" + GetSpecialFolders("Fonts") , + ;
"NetHood: " + GetSpecialFolders("NetHood") , + ;
"PrintHood: " + GetSpecialFolders("PrintHood") , + ;
"Programs: " + GetSpecialFolders("Programs") , + ;
"Recent: " + GetSpecialFolders("Recent") , + ;
"SendTo: " + GetSpecialFolders("SendTo") , + ;
"Startup: " + GetSpecialFolders("Startup") , + ;
"Templates: " + GetSpecialFolders("Templates")
Código: Selecionar todos
? "Windows: " + GetSpecialFolders(0) , + ;
"System32: " + GetSpecialFolders(1) , + ;
"Temp: " + GetSpecialFolders(2)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Acesso dbfs em pastas SpecialFolders
Ahhh legal !Quanto a conhecer seu aplicativo, digo que sim, inclusive esta dentro de minha pasta UTILS acima da WAPI.
Rochinha, o GetSpecialFolders, eu já tenho e não vejo a utilidade no STRU. Ora porque, é o usuário que escolhe o arquivo que deseja listar. Portanto pode ser em vários lugarfes e eu quis dizer que quando o usuário escolhe um dbf que está no "Meus documentos" eu me referia ao path completo. Isso já traz com a função GetFile. Mas o path completo que traz é do tipo long name. Então, não vejo a necessidade de uso da função GetSpecialFolders. Estou errado ?
Quanto a sua função Lfn2Sfn, não sei se é a versão do Harbour ou se você esqueceu de listar o código em C. Mas a função GetShortPathName não está no Harbour nativamente. Sim achei o WAPI_GETSHORTPATHNAME (Changelog 2010-02-13 Przemyslaw Czerpak) e também não funcionou.
Peço a ti por gentileza, fazer um teste:
Código: Selecionar todos
Function Main
Local cPath_Long:=GetSpecialFolders(16) // que é a pasta Meus documentos no seu PC
cPath_Short := Lfn2Sfn( cPath_Long )
MsgInfo( cPath_Short )
Return Nil
Function Lfn2Sfn( cDir )
Local cBuffer := space(261)
Local nLen
nLen := GetShortPathName( cDir, @cBuffer, len(cBuffer) )
Return Left( cBuffer, nLen )Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Acesso dbfs em pastas SpecialFolders
Epa !! Conseguí com esse mesmo código que passei !
Obrigado Rochinha, você é um anjo ! Valeu !
Obrigado Rochinha, você é um anjo ! Valeu !
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Acesso dbfs em pastas SpecialFolders
Amiguinho,
Obrigado. Somos pequenos pedaços de cérebro, funcionando e conseguindo o resultado para outros pedaços.
A função GetShortPathName() que passei foi um snippet de código, mas não sei se existe no Harbour. Preciso dar uma olhada no site de ajuda.
Obrigado. Somos pequenos pedaços de cérebro, funcionando e conseguindo o resultado para outros pedaços.
A função GetShortPathName() que passei foi um snippet de código, mas não sei se existe no Harbour. Preciso dar uma olhada no site de ajuda.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Acesso dbfs em pastas SpecialFolders
Como diz Chico Buarque na sua letra: "Todos juntos somos fortes. Somos flecha e somos arco.". O melhor do fórum é poder compartilhar conhecimento. "Pois tudo que até hoje sabemos, é devido a varias pessoas que compartilharam e assim esperam que você faça o mesmo."rochinha escreveu:Somos pequenos pedaços de cérebro, funcionando e conseguindo o resultado para outros pedaços.
A função GetShortPathName() não existe em Harbour, a que assemleha-se é da hbwhat a função VWN_GETSHORTPATHNAME mas em 2009-07-11 a contrib foi removida por Viktor Szakats.
Num código fonte hbvpdft.prg tem o seguinte comentário:
Então não consegui nem com GetShortPathName() nem com VWN_GETSHORTPATHNAME, consegui com WAPI_GETSHORTPATHNAME( cDir, @cBuffer, Len(cBuffer) ).This requires hbwhat, which in turns requires xhb.
Google translation: Isto requer hbwhat, que por sua vez requer XHB.
Mas ainda tenho algo estranho no STRU que não funciona normalmente como no exemplo citado. Vou ver o que é talvez com mais calma consiga descobrir o que eu fiz de errado.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.