Jump to content

Separadores de Directórios em diferentes SOs


pwseo
 Share

Recommended Posts

NOTA: Tópico dividido (mensagem original).

Outros compiladores Pascal sem acesso à ExtractFilePath

function GetExePath:String;[/quote]
var
   s,r:String;
   i:integer;
   Copia:boolean;
begin
   s:=ParamStr(0); // Atribuimos à variável S o caminho completo do executável
   r:=''; // Limpa a variável de resultado
   Copia:=False;  // Assume à partida que não é para copiar caracteres
   i:=length(s);  // Atribui a i o tamanho do caminho completo
   repeat
      if s[i]='\' then Copia:=True;  // Quando encontrar a primeira '\' activa a cópia (a contar da direita para a esquerda)
      if Copia then r:=s[i]+r;  // Se já tiver encontrado uma '\' (já descartou o ficheiro), copia o caracter lido para a variável de resultado
      dec(i);  // Anda para trás um caracter
   until i=0;  // Pára quando I for 0
   GetExePath:=r;  // Devolve o resultado
end;

Coloca-se aqui um problema importante: em sistemas operativos que não sejam Windows, o separador utilizado é a barra / e não a barra invertida \.

Eu penso que a SysUtils vem com todos os compiladores e portanto não será necessário recorrer a uma função caseira para isto. Além disso, não sei se o Pascal funciona como em C, onde podemos utilizar / como separador e o compilador trata de traduzir isso para o valor utilizado pelo sistema em questão.

Link to comment
Share on other sites

Pois, noutros sistemas operativos são necessários os devidos ajustes.

De qualquer maneira a função é só um exemplo de como usar o ParamStr(0)

A ExtractFilePath não existe em todos. Pelo menos no Turbo Pascal não me lembro de existir.

Mas altera-se já a função, e já não deverá haver problemas:

function GetExePath:String;
var
   s,r:String;
   i:integer;
   Copia:boolean;
begin
   s:=ParamStr(0); // Atribuimos à variável S o caminho completo do executável
   r:=''; // Limpa a variável de resultado
   Copia:=False;  // Assume à partida que não é para copiar caracteres
   i:=length(s);  // Atribui a i o tamanho do caminho completo
   repeat
      if s[i] in ['\','/'] then Copia:=True;  // Quando encontrar a primeira '\' ou '/' activa a cópia (a contar da direita para a esquerda)
      if Copia then r:=s[i]+r;  // Se já tiver encontrado uma '\' ou '/' (já descartou o ficheiro), copia o caracter lido para a variável de resultado
      dec(i);  // Anda para trás um caracter
   until i=0;  // Pára quando I for 0
   GetExePath:=r;  // Devolve o resultado
end;

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Isso continua com o problema de que em *nix os ficheiros podem ter \ como parte do seu nome 🙂

É melhor utilizar compilação condicional para isso 🙂

hmmmm Pois é, não me lembrava desse pormenor! lol

Não entendo porque raio se usam barras no nome! hehehehe

Assim é, usar uma condiçãozinha é o ideal neste caso!

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Em *nix podemos utilizar qualquer caractere no nome de um ficheiro excepto a barra / que é utilizada como separador na hierarquia... Por isso a verdadeira questão acaba por ser "porque é que no windows não é da mesma forma que nos outros sistemas operativos?" 😛

Link to comment
Share on other sites

lol

Há caracteres que, independentemente do sistema operativo, não deviam pertencer a nome nenhum.

Entre eles: \ / | : ; ,

🙂

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Informo as almas caridosas que estão com o problema das barras que até em VB.NET se utiliza a barra "normal", /, em vez da invertida.

Acho que em Pascal dará igualmente a utilização da barra comum... ?

Process.Start("C:\Users\thoga31")  ' Tradicional
Process.Start("C:/Users/thoga31")  ' Funciona na mesma

Nota: este trecho de código abre o Explorador do Windos no directório indicado.

Knowledge is free!

Link to comment
Share on other sites

Estranho, aqui em casa esse código não funciona...  🙂

Diz assim: "Caminho não Encontrado. . ."

Porque será?

😄🙂 :)

Já agora, o problema não é usar o \ ou o / com as funções do Pascal. Isso ele cumpre correctamente, mesmo que procures o c:/xpto.txt

A questão levantada é na função criada de raiz usar o / ou o \, consoante o sis. oper., porque nessa fase, não é um caminho, mas sim uma string.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Pronto, resolve-se a coisa assim:

function GetExePath:String;
const
   {$IFDEF Win32}
      PathDelimiter='\';
   {$ENDIF}
   {$ifdef Unix}
      PathDelimiter='/';
   {$endif}

var
   s,r:String;
   i:integer;
   Copia:boolean;
begin
   s:=ParamStr(0); // Atribuimos à variável S o caminho completo do executável
   r:=''; // Limpa a variável de resultado
   Copia:=False;  // Assume à partida que não é para copiar caracteres
   i:=length(s);  // Atribui a i o tamanho do caminho completo
   repeat
      if s[i] = PathDelimiter then Copia:=True;  // Quando encontrar a primeira '\' ou '/' activa a cópia (a contar da direita para a esquerda)
      if Copia then r:=s[i]+r;  // Se já tiver encontrado uma '\' ou '/' (já descartou o ficheiro), copia o caracter lido para a variável de resultado
      dec(i);  // Anda para trás um caracter
   until i=0;  // Pára quando I for 0
   GetExePath:=r;  // Devolve o resultado
end;

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Estranho, aqui em casa esse código não funciona...  🙂

Estranho, aqui em casa esse código funciona...  🙂

A questão levantada é na função criada de raiz usar o / ou o \, consoante o sis. oper., porque nessa fase, não é um caminho, mas sim uma string.

Para quem não tem a SysUtils é uma questão de instalar o Free Pascal em vez de outras maravilhas da natureza informática 🙂

Mas pronto, já resolveste a questão com as Compiler Directives.

Knowledge is free!

Link to comment
Share on other sites

E a muito custo diga-se... Tentei fazer uma função o mais basica possível para ver se funcionava até no PascalZIM (não devia ter o que fazer...)...

Claro que agora com as Conditional Defines, se alguém for a tentar a dita função, o PZim explode num cogumelo radioactivo e arrasa quem perto dele se encontrar!  🙂 :)

É bem feito, prá próxima usam um compilador em condições (ou melhor dizendo, usam um compilador...  ?)

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Tópico dividido.


E a muito custo diga-se... Tentei fazer uma função o mais basica possível para ver se funcionava até no PascalZIM (não devia ter o que fazer...)...

Então não o fizesses 🙂

De qualquer das formas, fica sempre bem uma função caseira para o efeito. 🙂

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.