Fórum Função que retorna a capacidade do disquete #301351

31/10/2005

0

Precido de uma função que compare o tamanho de um arquivo txt com a capacidade disponivel em um disquete... Se a capacidade do disquete for maior salvo , caso o contrário, aborto e comunique que sera necessário outro disquete

Obrigado..


Marco Salles

Marco Salles

Responder

Posts

01/11/2005

Martins

[quote:fe2838ca9f=´Marco Salles´]Precido de uma função que compare o tamanho de um arquivo txt com a capacidade disponivel em um disquete... Se a capacidade do disquete for maior salvo , caso o contrário, aborto e comunique que sera necessário outro disquete

Obrigado..[/quote:fe2838ca9f]

Marcos o disquete vazio tem uma capacidade fixa certo? Então não seria um opção vc verificar o tamanho dos arquivos q estiverem nesse disquete caso haja algum e subtrair da capacidade total do disquete comparando o saldo com o tamanho do seu arquivo texto, caso o disquete esteja vazio, é só verificar de o espaço disponível é menor do q seu arquivo texto, resguardando pq os tamanhos não podem ser iguais para evitar erro na leitura de header do disco.

Só uma idéia louca aqui, vou ver se isso na prática funciona.


Boa Sorte!!


Responder

Gostei + 0

01/11/2005

Massuda

Já experimentou dar uma olhada nas funções DiskSize e DiskFree da unit SysUtils? Com elas você pode montar a rotina que você precisa.


Responder

Gostei + 0

01/11/2005

Martins

Já experimentou dar uma olhada nas funções DiskSize e DiskFree da unit SysUtils? Com elas você pode montar a rotina que você precisa.

Mandou super bem [b:41aef9203b]Massuda[/b:41aef9203b], como sempre, hehehe :D

Dá para implementar algo bem interessante com DiskFree, DiskSize e pegando o tamnho do Arquivo, vai ficar Show!!!


Responder

Gostei + 0

01/11/2005

Adriano Santos

Sendo mais detalhista, pegai.

procedure TForm1.Button1Click(Sender: TObject);
var
   F        : File of Byte;
   Tamanho  : Longint;
   S        : String;
begin
  AssignFile(f, ´C:\Winnt\System32\Calc.exe´);
  Reset(F);
  Tamanho := FileSize(F);
  //Onde : 0 = Corrente, 1 = A, 2 = B,...
  if Tamanho < (DiskFree(0) div 1024) then
    ShowMessage(´Tamanho do Arquivo: ´ + IntToStr(Tamanho) + #1310 + ´Espaço em disco: ´ +
      IntToStr((DiskFree(0) div 1024)) + 1310 + ´Dá pra gravar´)
  else
    ShowMessage(´Disco cheio´);
  CloseFile(f);
end;



Responder

Gostei + 0

02/11/2005

Marco Salles

Obrigado a todos pela participação .

Mas na verdade eu estou querendo é comparar o tamanho de Uma lista do Tioi TStringList com o tamanho do espaço vazio do disquete.

Eu não sei qual a função que retorna o Tamano desta Lista

Tipo FileSize no caso de arquivos

Desde ja meus agadecimentos


Responder

Gostei + 0

02/11/2005

Massuda

[quote:fc3b545793=´Marco Salles´]Eu não sei qual a função que retorna o Tamano desta Lista [/quote:fc3b545793]Imaginando que você vai gravar a lista usando TStringList.SaveToFile, isso deve dar o tamanho do arquivo que será gravado...
var
  Tamanho: Integer;
...
  Tamanho := Length(SuaStringList.Text);
...



Responder

Gostei + 0

02/11/2005

Marco Salles

Imaginando que você vai gravar a lista usando TStringList.SaveToFile, isso deve dar o tamanho do arquivo que será gravado...Código: var Tamanho: Integer; ... Tamanho := Length(SuaStringList.Text);


Beleza massuda , mas da para comparar isto com DiskFree(0) div 1024

Com sugerido pelo Adriano santos sem perda de confiabilidade ???

var 
  Tamanho: Integer; 
... 
  Tamanho := Length(SuaStringList.Text)
 
 if Tamanho < (DiskFree(0) div 1024) then 
    ShowMessage(´Da para gravar´) 
  else 
    ShowMessage(´Disco cheio´); 



Responder

Gostei + 0

02/11/2005

Adriano Santos

[quote:604111efb7=´Marco Salles´]
Imaginando que você vai gravar a lista usando TStringList.SaveToFile, isso deve dar o tamanho do arquivo que será gravado...Código: var Tamanho: Integer; ... Tamanho := Length(SuaStringList.Text);


Beleza massuda , mas da para comparar isto com DiskFree(0) div 1024

Com sugerido pelo Adriano santos sem perda de confiabilidade ???

var 
  Tamanho: Integer; 
... 
  Tamanho := Length(SuaStringList.Text)
 
 if Tamanho < (DiskFree(0) div 1024) then 
    ShowMessage(´Da para gravar´) 
  else 
    ShowMessage(´Disco cheio´); 
[/quote:604111efb7]


Então [b:604111efb7]Marcos Salles[/b:604111efb7], não estou vendo dificuldades, pois as duas ´variáveis´, Tamanho e o resultado de DiskSize(0) div 1024, são do tipo Integer, isso significa que podem ser comparadas normalmente. Não entendi onde está sua preocupação ou dúvida.


Responder

Gostei + 0

03/11/2005

Marco Salles

Então Marcos Salles, não estou vendo dificuldades, pois as duas ´variáveis´, Tamanho e o resultado de DiskSize(0) div 1024, são do tipo Integer, isso significa que podem ser comparadas normalmente. Não entendi onde está sua preocupação ou dúvida.


A unica duvida é que apesar de integer e Longint ser definido entre o mesmo intervalo , qual é a diferença real entre essas duas definiçoes . Pois
var
tamanho:Integer;
OutroTipo:Longint;
....
tamanho:=(DiskFree(0) div 1024);
OutroTipo:=(DiskFree(0) div 1024);


[b:97c7f88392]Aparentemente é a mesma coisa.. [/b:97c7f88392]Então o p orque destas duas definiçoes :?: :?: :?: :?:


Responder

Gostei + 0

03/11/2005

Massuda

[quote:69db0e9169=´Marco Salles´]
... 
  Tamanho := Length(SuaStringList.Text)
 
 if Tamanho < (DiskFree(0) div 1024) then 
...
[/quote:69db0e9169]Delphi define Integer como sendo o formato inteiro nativo da máquina de modo que, atualmente, Integer é igual a Longint (inteiro com sinal 32 bits). No tempo do Delphi 1, Integer era igual a Smallint (inteiro com sinal 16 bits). Num futuro próximo, Integer será igual ao atual Int64 (inteiro com sinal 64 bits).

Em outras palavras, Integer é um tipo de dado que depende da implementação do compilador, enquanto Shortint, Smallint, Longint, Int64, Byte, Word e Longword são tipos de dado cujo tamanho/capacidade são pré-definidos.

No código que você postou, tem outro ponto importante: a variável Tamanho contem um valor em bytes (resultado do Length) enquanto o (DiskFree(0) div 1024) resulta em um valor em kilobytes, ou seja, você está comparando coisas diferentes.

O correto seria, ou dividir tamanho por 1024 ou simplesmente usar o valor retornado por DiskFree sem dividir por 1024.


Responder

Gostei + 0

03/11/2005

Adriano Santos

[quote:56c1803e85=´Marco Salles´]
... 
  Tamanho := Length(SuaStringList.Text)
 
 if Tamanho < (DiskFree(0) div 1024) then 
...
Delphi define Integer como sendo o formato inteiro nativo da máquina de modo que, atualmente, Integer é igual a Longint (inteiro com sinal 32 bits). No tempo do Delphi 1, Integer era igual a Smallint (inteiro com sinal 16 bits). Num futuro próximo, Integer será igual ao atual Int64 (inteiro com sinal 64 bits).

Em outras palavras, Integer é um tipo de dado que depende da implementação do compilador, enquanto Shortint, Smallint, Longint, Int64, Byte, Word e Longword são tipos de dado cujo tamanho/capacidade são pré-definidos.

No código que você postou, tem outro ponto importante: a variável Tamanho contem um valor em bytes (resultado do Length) enquanto o (DiskFree(0) div 1024) resulta em um valor em kilobytes, ou seja, você está comparando coisas diferentes.

O correto seria, ou dividir tamanho por 1024 ou simplesmente usar o valor retornado por DiskFree sem dividir por 1024.[/quote:56c1803e85]

[b:56c1803e85]Massuda[/b:56c1803e85] boa explicação. Tive a impressão de que estávamos criando uma tempestade em copo d´água no meu post anterior.


Responder

Gostei + 0

03/11/2005

Marco Salles

Tive a impressão de que estávamos criando uma tempestade em copo d´água no meu post anterior.


[b:9a2b4dabc6]Pelo que me foi passado , achei tb que seria fácil resolução.. [/b:9a2b4dabc6]A unica duvida que tinha ficado foi quanto a definição de tipos Integer e longint

Mas na pratica quando tento gravar um arquivo txt em um disquete que [size=18:9a2b4dabc6]esta cheio [/size:9a2b4dabc6], a comparação

[b:9a2b4dabc6]if Tamanho < (DiskFree(0) div 1024) then [/b:9a2b4dabc6]

:arrow: :arrow: :arrow:
[b:9a2b4dabc6][color=darkred:9a2b4dabc6]Esta retornando verdadeiro . Quando eu esperava que retornasse falso...[/color:9a2b4dabc6][/b:9a2b4dabc6]


Segue um Fragmento do meu código ::::::::::::::::::::::::::

var 
  Tamanho: Integer; 
  Lista:TStringLista;
  FileName:String;
  LogFile: TextFile;
... 

 // Crio a Lista e coloco dados nela , blablabla... 

  Tamanho := Length(Lista.Text) 

 if Tamanho < (DiskFree(0) div 1024) then 
    begin
      FileName:=´A:\TesteEmDelphi.txt;
      AssignFile (LogFile, Filename);
      Lista.SaveToFile(FileName);
    end
  else 
    ShowMessage(´Disco cheio´); 


:cry: :cry: :cry: :cry: :cry:
Como o Disco [size=18:9a2b4dabc6]esta cheio[/size:9a2b4dabc6] e o teste[b:9a2b4dabc6] if Tamanho < (DiskFree(0) div 1024) then [/b:9a2b4dabc6]não esta filtrando esta condição , obtenho um erro , quando tento fazer : :arrow: :arrow: :arrow:

[b:9a2b4dabc6]Lista.SaveToFile(FileName);[/b:9a2b4dabc6]

O Erro que obtenho é este :

[URL=http://imageshack.us][img:9a2b4dabc6]http://img176.imageshack.us/img176/3507/imagemdisquetecheio7gj.jpg[/img:9a2b4dabc6][/URL]

:?: :?: :?: :?: :?:
Pergunto então ::: O Que estou fazendo de errado , o que não estou fazendo , e sera que dá para confiar nesse teste

Tamanho := Length(Lista.Text) 

 if Tamanho < (DiskFree(0) div 1024) then 


:?: :?: :?: :?: :?: :?:


Responder

Gostei + 0

03/11/2005

Massuda

Notei que seu código de gravação está errado... se estiver usando TStringList.SaveToFile, voê não precisa do AssignFile (assim como não precisa de qualquer outra função de manipulação de arquivos). Ficaria algo assim...
var 
  Tamanho: Integer; 
  Lista:TStringList;
  FileName:String;
... 

 // Crio a Lista e coloco dados nela , blablabla... 

  Tamanho := Length(Lista.Text) 

 if Tamanho < DiskFree(0)  then 
    begin
      FileName:=´A:\TesteEmDelphi.txt;
      Lista.SaveToFile(FileName);
    end
  else 
    ShowMessage(´Disco cheio´); 
...Fora isso, o teste Tamanho < DiskFree(0) só faz sentido se você estiver gravando um novo arquivo em cada tentativa; caso contrário, o melhor é excluir o arquivo existente para ter um valor de DiskFree correto no teste.


Responder

Gostei + 0

03/11/2005

Martins

Iria sugerir mais ou menos isso q o [b:9eb9713b69]Massuda[/b:9eb9713b69], postou, não esatamente com tantos detalhes, outra coisa, [b:9eb9713b69]Marco[/b:9eb9713b69], vc vai gravar em disquete não é isso? pois bem, o parametro passado para [b:9eb9713b69]DiskFree[/b:9eb9713b69] está errado se for para verificar o disquete, pq deveria estar assim [b:9eb9713b69]DiskFree(1)[/b:9eb9713b69]. Ou então estou sem entender a situação.

Parametros do [b:9eb9713b69]DiskFree:[/b:9eb9713b69]
[color=darkred:9eb9713b69]
0 = Corrente
1 = A
2 = B
[/color:9eb9713b69]


Responder

Gostei + 0

03/11/2005

Martins

Iria sugerir mais ou menos isso q o [b:1e16be4704]Massuda[/b:1e16be4704], postou, não esatamente com tantos detalhes, outra coisa, [b:1e16be4704]Marco[/b:1e16be4704], vc vai gravar em disquete não é isso? pois bem, o parametro passado para [b:1e16be4704]DiskFree[/b:1e16be4704] está errado se for para verificar o disquete, pq deveria estar assim [b:1e16be4704]DiskFree(1)[/b:1e16be4704]. Ou então estou sem entender a situação.

Parametros do [b:1e16be4704]DiskFree:[/b:1e16be4704]
[color=darkred:1e16be4704]
0 = Corrente
1 = A
2 = B
[/color:1e16be4704]


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar