[Cascavel-pm] Nomes longos no windows

Er Galvão Abbott - PM Porto Alegre pmpoa em galvao.eti.br
Sábado Abril 9 13:03:02 PDT 2005


Pessoal:

Primeiramente valeu pelas respostas. Como sempre bem informativas e 
claras. Decidi usar o system com uma lista, como o Flávio recomendou, 
mas agora pintou outra dúvida:

Eu executo duas chamadas system, uma para criar o diretório ($dirs[$d]) 
dentro do arquivo Zip e uma para criar o arquivo ($files[$f]) dentro do 
diretório dentro do arquivo Zip.

Acontece que o WinRAR reclama que não pode usar o arquivo Zip porque ele 
já está sendo usado por outro processo. Eu entendo que cada chamada 
system faz um fork que cria um processo, certo?

Ou seja, antes de cada operação (tanto de inserção de diretório como de 
inserção de arquivo) eu teria que verificar se o processo anterior já 
terminou o trabalho, correto?

Alguém poderia me dar umas dicas? Eu sei que tenho que usar signals, mas 
como nunca usei antes queria umas dicas de vocês. Notem como é feito o 
processo todo:

  1    for ($d = 0; $d < scalar(@dirs); $d++)
  2   {
  3        system('C:/arquivos de programas/winrar/winrar.exe', 'A', 
'-ibck', '-afzip', '-m5', 'C:/'.$compfile, $dirs[$d]);
  4      
  5        opendir(DH, $dirs[$d]) or die ('Impossivel abrir o diretório 
'.$dirs[$d].': '.$!);
  6        @files = grep { $_ ne '.' && $_ ne '..' } readdir DH;
  7      
  8        for ($f = 0; $f < scalar (@files); $f++)
  9        {
10            system('C:/arquivos de programas/winrar/winrar.exe', 'A', 
'-ibck', '-afzip', '-m5', 'C:/'.$compfile, $dirs[$d].'/'.$files[$f]);
11        }
12      
13        closedir(DH);
14    }

Se eu entendi corretamente estas checagens deveriam ser feitas antes da 
linha 3 e antes da linha 10, correto?

Mais uma vez valeu pela inestimável ajuda!

Er Galvão Abbott
-------------------------------------
Porto Alegre Perl Mongers
http://portoalegre.pm.org/
--------------------------------------
pmpoa em galvao.eti.br
--------------------------------------



Luis Campos de Carvalho wrote:

> Er Galvão Abbott - PM Porto Alegre wrote:
>
>> Pois é, pessoal, olhem que estranho:
>>
>> Atualizei minha instalação do ActivePerl aqui para a última versão:
>>
>> This is perl, v5.8.6 built for MSWin32-x86-multi-thread
>> (with 3 registered patches, see perl -V for more detail)
>>
>> mas continuo com problemas. Estou fazendo uma chamada system que 
>> funciona perfeitamente se eu colocar:
>>
>> system('C:/arquiv~1/winrar/winrar.exe A -ibck -afzip -m5 
>> C:/'.$compfile.' '.$dirs[$d].'/'.$files[$f].' > '.$logfile);
>>
>> Mas não funciona se eu colocar:
>>
>> system('C:/arquivos de programas/winrar/winrar.exe A -ibck -afzip -m5 
>> C:/'.$compfile.' '.$dirs[$d].'/'.$files[$f].' > '.$logfile);
>>
>> O erro é:
>>
>> " 'C:/arquivos' não é reconhecido como um comando interno ou externo, 
>> um programa operável ou um arquivo em lotes. "
>>
>> Estou fazendo a chamada desse system ligada a um botão em uma janela Tk.
>>
>> Alguma sugestão?
>
>
>   Simples.
>   Vai funcionar perfeitamente se você disser
>
>   system( q{"C:/arquivos de programas/winrar/winrar.exe" A -ibck 
> -afzip -m5 C:/}.$compfile.' '.$dirs[$d].'/'.$files[$f].' > '.$logfile);
>
>   Repare que eu usei q{} para quotar a primeira string, e que eu 
> quotei (DOS-like) o nome do programa. Este é o seu problema: você 
> precisa se lembrar de que o system() chama o shell do DOS 
> (command.exe) e que este "shell" não é lá muito inteligente... ;-)
>
>   Se resolveu, avisa a gente.
>   Putamplexos!



Mais detalhes sobre a lista de discussão Cascavel-pm