abertura de arquivo em pasta com nome extenso
Moderador: Moderadores
abertura de arquivo em pasta com nome extenso
Pessoal, por favor, esclareçam uma dúvida: como faço para abrir uma base de dados .dbf que está em uma pasta com nome longo?
Estou tentando assim: c:\"nome extenso"\agenda\base.dbf
Está errado? Está dando arquivo inexistente, mas o arquivo existe.
Agradeço qualquer ajuda.
Inacio
Estou tentando assim: c:\"nome extenso"\agenda\base.dbf
Está errado? Está dando arquivo inexistente, mas o arquivo existe.
Agradeço qualquer ajuda.
Inacio
Inacio de Carvalho Neto
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
abertura de arquivo em pasta com nome extenso
Costumo usar assim mesmo.
É pasta protegida?
Outra opção, talvez usar a rotina do Windows de converter pra nome abreviado.
É pasta protegida?
Outra opção, talvez usar a rotina do Windows de converter pra nome abreviado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
abertura de arquivo em pasta com nome extenso
Amiguinhos,
Use as segunites funções
Exemplo de salvamento de um caminho longo em formato curto:
Recuperando o nome curto, salvo anteriormente e alongando-o:
Use as segunites funções
Código: Selecionar todos
/////////////////////////////////////////////////////////////////////////////
//
// Thanks to Jim Gale
//
/////////////////////////////////////////////////////////////////////////////
#include "Struct.ch"
FUNCTION Sfn2Lfn(cShort)
Local cLong:=""
Local nFor, nAt
nAt :=1
cShort := Alltrim( StrTran( cShort, "/", "\" ) )
If !File( cShort ) .and. !lIsDir( cShort )
RETURN ""
Endif
If SubStr( cShort, 2, 1 ) == ":"
If Len( cShort ) < 4
RETURN cShort
Endif
cLong := SubStr( cShort, 1, 3)
nAt := 4
Endif
For nFor := nAt TO Len( cShort )
If SubStr( cShort, nFor, 1 ) == "\"
cLong += _Sfn2Lfn( SubStr( cShort, 1, nFor - 1 ) ) + "\"
Endif
Next
RETURN cLong+_Sfn2Lfn( cShort )
STATIC FUNCTION _SFN2LFN( cSpec )
Local oWin32, cBuffer, nHandle
STRUCT oWin32
MEMBER nFileAttributes AS DWORD
MEMBER nCreation AS STRING LEN 8
MEMBER nLastRead AS STRING LEN 8
MEMBER nLastWrite AS STRING LEN 8
MEMBER nSizeHight AS DWORD
MEMBER nSizeLow AS DWORD
MEMBER nReserved0 AS DWORD
MEMBER nReserved1 AS DWORD
MEMBER cFileName AS STRING LEN 260
MEMBER cAltName AS STRING LEN 14
ENDSTRUCT
cBuffer := oWin32:cBuffer
nHandle := apiFindFst( cSpec, @cBuffer )
oWin32:cBuffer := cBuffer
apiFindCls( nHandle )
RETURN Psz( oWin32:cFileName )
FUNCTION Lfn2Sfn(cDir)
Local cBuffer := Space(261)
Local nLen
nLen := GetShortPathName( cDir, @cBuffer, Len(cBuffer) )
RETURN Left(cBuffer, nLen)
STATIC FUNCTION psz( c ) ; RETURN substr( c, 1, At( Chr(0), c ) - 1 )
//----------------------------------------------------------------------------//
DLL32 Function apiFindFst( lpFilename AS LPSTR,;
@cWin32DataInfo AS LPSTR ) AS LONG ;
PASCAL FROM "FindFirstFileA" LIB "Kernel32.dll"
DLL32 Function apiFindNxt( nHandle AS LONG,;
@cWin32DataInfo AS LPSTR ) AS BOOL ;
PASCAL FROM "FindNextFileA" LIB "Kernel32.dll"
DLL32 Function apiFindCls( nHandle AS LONG) AS BOOL ;
PASCAL FROM "FindClose" LIB "Kernel32.dll"
DLL32 FUNCTION GetShortPathName( lpLongPath AS LPSTR,;
lpShortPath AS LPSTR,;
wBufferLen AS DWORD ) AS DWORD ;
PASCAL FROM "GetShortPathNameA" LIB "kernel32.dll"
DLL32 Function GetFullPathName( lpszFile AS LPSTR,;
cchPath AS DWORD,;
lpszPath AS LPSTR,;
@nFilePos AS PTR ) AS DWORD ;
PASCAL FROM "GetFullPathNameA" LIB "kernel32.dll"
Código: Selecionar todos
REPLACE FILIAL->CAMINHO WITH Lfn2Sfn( cPath )
Código: Selecionar todos
cCAMINHO := Sfn2Lfn( FILIAL->CAMINHO )
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:
abertura de arquivo em pasta com nome extenso
Amiguinhos,
Tentei editar mas por duas vezes o forum me pediu login e não alterou o post, lancei mais um trecho.
Amiguinhos,
Exemplo:
Veja se funciona.
Vou limpar os cookies.
Tentei editar mas por duas vezes o forum me pediu login e não alterou o post, lancei mais um trecho.
Amiguinhos,
Exemplo:
Código: Selecionar todos
cLongPath := "C:\Nossa que nome de pasta grande\nao vai caber\coisa de louco\arquivo.exe"
? file( cLongPath )
.F.
? file( Lfn2Sfn( cLongPath ) )
.T.
Vou limpar os cookies.
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.
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
abertura de arquivo em pasta com nome extenso
Olá!
@Rochinha
Grato pela contribuição. Poderia anexar o arquivo struct.ch?
@Rochinha
Grato pela contribuição. Poderia anexar o arquivo struct.ch?
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
abertura de arquivo em pasta com nome extenso
Código: Selecionar todos
// FiveWin C language structures support commmands
#ifndef _C_STRUCT
#define _C_STRUCT
#xcommand STRUCT <oStruct> => <oStruct> := ThisStruct( TStruct():New() )
#xcommand MEMBER <cName> AS <type> ;
[ LEN <nLen> ] ;
[ INIT <uValue> ] ;
=> ;
ThisStruct():AddMember( <(cName)>, <type>, <nLen> ) ;;
[ ThisStruct():SetMember( Len( ThisStruct():aMembers ), <uValue> ) ]
#xcommand ENDSTRUCT => ThisStruct( nil )
#endifNotei que websiteseguro aparece na url, acho que por isto estou penando.
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.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
abertura de arquivo em pasta com nome extenso
Talvez dê pra usar direto, em todo caso, tenho anotado aqui deste jeito:
Código: Selecionar todos
FUNCTION win_GetShortPathName( cPath )
LOCAL cShort := Space(5000)
wapi_GetShortPathName( cPath, @cShort, Len( cShort) )
RETURN cShort
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
abertura de arquivo em pasta com nome extenso
Olá!
@Rochinha: obrigado por postar o arquivo mas, mesmo com ele, não é possível compilar o teu exemplo. O arquivo .CH referencia uma função e uma classe que não temos:
Quanto aos teus problemas de acesso ao site do fórum: utilizo o Chrome como navegador e ele sempre classifica o site do fórum como "Não Seguro". Já tive o problema que você relata algumas vezes. Mas é muito raro acontecer...
@Rochinha: obrigado por postar o arquivo mas, mesmo com ele, não é possível compilar o teu exemplo. O arquivo .CH referencia uma função e uma classe que não temos:
Código: Selecionar todos
ThisStruct( TStruct():New() )[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
abertura de arquivo em pasta com nome extenso
Amiguinhos,
Notei que a função Lnf2Sfn() faz uso direto da API do Windows. Vendo que está declarada a getFullPathName() você pode criar a Sfn2Lfn() baseada na Lnf2Sfn()
Mas para o seu caso use apenas:
Voce transforma longos nomes em curtos.
Notei que a função Lnf2Sfn() faz uso direto da API do Windows. Vendo que está declarada a getFullPathName() você pode criar a Sfn2Lfn() baseada na Lnf2Sfn()
Código: Selecionar todos
DLL32 FUNCTION GetFullPathNameA;
( lpFileName AS STRING, ;
nBufferLength AS LONG, ;
lpBuffer AS STRING, ;
lpFilePart AS STRING ) ;
AS LONG PASCAL;
FROM "GetFullPathNameA" LIB "KERNEL32"
Código: Selecionar todos
FUNCTION Sfn2LfnA(cDir)
Local cBuffer := Space(261)
Local nLen
nLen := GetFullPathNameA( cDir, Len(cBuffer), @cBuffer )
RETURN Left(cBuffer, nLen)
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 apiFindFst( lpFilename AS LPSTR,;
@cWin32DataInfo AS LPSTR ) AS LONG ;
PASCAL FROM "FindFirstFileA" LIB "Kernel32.dll"
DLL32 Function apiFindNxt( nHandle AS LONG,;
@cWin32DataInfo AS LPSTR ) AS BOOL ;
PASCAL FROM "FindNextFileA" LIB "Kernel32.dll"
DLL32 Function apiFindCls( nHandle AS LONG) AS BOOL ;
PASCAL FROM "FindClose" LIB "Kernel32.dll"
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.
