• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

dinosaur

aceder parte de ficheiro

28 mensagens neste tópico

Preciso de Ajuda!

Alguem me pode dizer para aceder a apenas uma parte de um ficheiro.

Por exemplo: eu tenho um ficheiro de 2586KB e quero ler apenas os últimos 120KB.

Desde já obrigado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se quiseres ler apenas 120 KB de um ficheiro de 2586 KB então só precisas de fazer o seguinte:

$fp = fopen( 'nome_do_ficheiro', 'rb' );
$conteudo = '';
while(!feof( $fp )) {
   $conteudo .= fgets( $fp, 122880 );   // 122880 bytes equivale a 120 KB
}
echo $conteudo;
fclose( $fp ); 

Isto vai ler os primeiros 120 KB do ficheiro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É mesmo isto. Thnx.

Se quiseres ler apenas 120 KB de um ficheiro de 2586 KB então só precisas de fazer o seguinte:

$fp = fopen( 'nome_do_ficheiro', 'rb' );
$conteudo = '';
while(!feof( $fp )) {
  $conteudo .= fgets( $fp, 122880 );   // 122880 bytes equivale a 120 KB
}
echo $conteudo;
fclose( $fp ); 

Isto vai ler os primeiros 120 KB do ficheiro

Pois, mas eu quero é ler os últimos.

De qualquer forma obrigado. Já resolvi o problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Posta aqui como e que fizeste

Ainda não acabei, mas quando acabar podes ter a certeza que vou postar aqui.

De qualquer forma posso adiantar que é um speed tester. Eu já tinha feito um mas era muito pouco fiável.

Como se fazia sempre download do mesmo ficheiro, a velocidade aumentava astronómicamente no segundo teste, porque o browser guardava o ficheiro na cache.

Desta forma, como a parte do ficheiro a fazer download é aleatória, não ocorre este problema.

P.S.: Dá para fazer isto (fseek) num ficheiro que se encontre noutro servidor?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como?

Olha o que diz aqui:

"May not be used on file pointers returned by fopen() if they use the "http://" or "ftp://" formats. fseek() gives also undefined results for append-only streams (opened with "a" flag)"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como?

fwrite(fopen("tmp.tmp", "w"), file_get_contents("http://pap.djthyrax.com"));

$fp = fopen('tmp.tmp', 'r');
fseek($fp, 100);
echo fgets($fp, 4096);

:P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como?

fwrite(fopen("tmp.tmp", "w"), file_get_contents("http://pap.djthyrax.com"));

$fp = fopen('tmp.tmp', 'r');
fseek($fp, 100);
echo fgets($fp, 4096);

:cheesygrin:

Mas isso cria um ficheiro temporário no meu servidor não é?

A minha ideia era o utilizador fazer download de uma parte do ficheiro no outro servidor, sem sobrecarregar o meu.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como?

fwrite(fopen("tmp.tmp", "w"), file_get_contents("http://pap.djthyrax.com"));

$fp = fopen('tmp.tmp', 'r');
fseek($fp, 100);
echo fgets($fp, 4096);

:cheesygrin:

Mas isso cria um ficheiro temporário no meu servidor não é?

A minha ideia era o utilizador fazer download de uma parte do ficheiro no outro servidor, sem sobrecarregar o meu.

Cria. Como queres fazer n me parece mt possível. :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como?

fwrite(fopen("tmp.tmp", "w"), file_get_contents("http://pap.djthyrax.com"));

$fp = fopen('tmp.tmp', 'r');
fseek($fp, 100);
echo fgets($fp, 4096);

:cheesygrin:

Mas isso cria um ficheiro temporário no meu servidor não é?

A minha ideia era o utilizador fazer download de uma parte do ficheiro no outro servidor, sem sobrecarregar o meu.

Cria. Como queres fazer n me parece mt possível. :P

ok de qualquer forma obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de avançar com a minha ideia, tenho algumas perguntas:

Têm de ser precisamente os 120 KB?

Que tipo de ficheiro queres 'ler'?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de avançar com a minha ideia, tenho algumas perguntas:

Têm de ser precisamente os 120 KB?

Que tipo de ficheiro queres 'ler'?

Não eu dei os 120KB apenas como exemplo.

Pretendo ler um ficheiro qualquer (é só para testar a velocidade) mas em principio vai ser um ficheiro ISO (de uma distribuição linux).

paz

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, então esta é a minha sugestão:

<?php
$x = file("http://ficheiro_enorme/ficheiro.iso");
$x = array_reverse($x);
$y = 0;

$valor = array();

foreach($x as $conteudo) {
     
 $valor[] = $conteudo;
  if($y == 5000) //-- AQUI É QUE ESTÁ O PUZZLE ... :-/ --//
  break;
  $y++;
}
$valor = array_reverse($valor);

//-- IMPEDIR CACHE --//
header("Cache-Control: no-store, no-cache, must-revalidate"); 

//-- ENVIAR HEADERS DE TEXTO ?? --//
header("Content-Type: text/plain");

foreach($valor as $download) {
  echo $download; 
ob_flush();
flush();
}  
?>

Agora se funciona ou não para o que tu queres, isso é que já não posso garantir...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema desse código é o mesmo que do meu, o script saca o ficheiro TODO enquanto que ele quer sacar apenas 120KB do ficheiro.

Anyway, com sockets deve dar ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se a versão do teu PHP é maior ou igual 5.1.0 então acho que este código serve

<?php
$fp = file_get_contents("http://www.site_do_ficheiro.com/ficheiro.iso", FALSE, NULL, 0, 122880); //Vai sacar apenas 120 KB

if(!$fp) {
die( 'Ocorreu um erro' );
}

/* Depois fazes o que quiseres  */
?>

EDIT:

Já agora... -IceBurn- explica-me uma coisa porquê que utilizaste a função array_reverse(); no teu código ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EDIT:

Já agora... -IceBurn- explica-me uma coisa porquê que utilizaste a função array_reverse(); no teu código ?

para no topo da array ficar o fim do ficheiro ;)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EDIT:

Já agora... -IceBurn- explica-me uma coisa porquê que utilizaste a função array_reverse(); no teu código ?

para no topo da array ficar o fim do ficheiro :)

Eu sei que o array_reverse faz isso  ;)

Mas tipo... ele utilizou duas vezes array_reverse(); o que faz com o que o fim do ficheiro volte para o fim do array, não achas que é desnecessario  usar array_reverse();  ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A segunda vez que ele utiliza o array_reverse já não é aplicado ao stream todo, mas sim apenas à parte que era para ler. E porquê? Porque essa parte estava invertida...

Imagina que o ficheiro era 1234567 e tu só querias os últimos 3 números. array_reverse(1234567) = 7654321. Agora tiram-se os 3 primeiros números... 765, mas o que tu querias era 567, logo, array_reverse em cima ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ahh.. agora entendi :) btw neste caso continua a ser desnecessário porque não interessa a parte do código que se quer ler ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, penso que a parte de eu ter utilizado array_reverse está explicada. :P

Kingless, antes do output voltei a utilizar array reverse para voltar a meter tudo pela ordem,

enfim, claro que aí a função é facultativa, dependendo da necessidade ou não de apresentar os dados pela ordem correcta.

Resumindo:

- array_reverse para ler as últimas linhas do ficheiro: se não estou enganado ele frisou que queria apenas ler a última parte do ficeiro.

- array_reverse no final para ordenar a array: como referi, se o output não for importante, torna-se então desnecessário voltar a chamar a função.

E para finalizar, agora que se fala no assunto, poderia ter simplificado o código, mas ok, aquilo foi feito assim às '3 pancadas'. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

- array_reverse para ler as últimas linhas do ficheiro: se não estou enganado ele frisou que queria apenas ler a última parte do ficheiro.

Pois... nem tinha reparado que ele disse que queria ler a última parte do ficheiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

- array_reverse para ler as últimas linhas do ficheiro: se não estou enganado ele frisou que queria apenas ler a última parte do ficheiro.

Pois... nem tinha reparado que ele disse que queria ler a última parte do ficheiro.

Não é exactamente a última parte do ficheiro. É uma parte aleatória do.

Estou a analisar atentamente as vossas sugestões e vou postar os resultados brevemente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora