Função que retorna a capacidade do disquete

Delphi

31/10/2005

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

Curtidas 0

Respostas

Martins

Martins

31/10/2005

[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!!


GOSTEI 0
Massuda

Massuda

31/10/2005

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


GOSTEI 0
Martins

Martins

31/10/2005

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!!!


GOSTEI 0
Adriano Santos

Adriano Santos

31/10/2005

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;



GOSTEI 0
Marco Salles

Marco Salles

31/10/2005

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


GOSTEI 0
Massuda

Massuda

31/10/2005

[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);
...



GOSTEI 0
Marco Salles

Marco Salles

31/10/2005

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´); 



GOSTEI 0
Adriano Santos

Adriano Santos

31/10/2005

[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.


GOSTEI 0
Marco Salles

Marco Salles

31/10/2005

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 :?: :?: :?: :?:


GOSTEI 0
Massuda

Massuda

31/10/2005

[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.


GOSTEI 0
Adriano Santos

Adriano Santos

31/10/2005

[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.


GOSTEI 0
Marco Salles

Marco Salles

31/10/2005

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 


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


GOSTEI 0
Massuda

Massuda

31/10/2005

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.


GOSTEI 0
Martins

Martins

31/10/2005

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]


GOSTEI 0
Martins

Martins

31/10/2005

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]


GOSTEI 0
Adriano Santos

Adriano Santos

31/10/2005

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


Foi o que eu postei lá em cima logo no comecinho da discussão.

[quote:e5b9054df6=´Adriano Santos´]Sendo mais detalhista, pegai.

[quote=Adriano Santos]
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);
[b:e5b9054df6][color=red:e5b9054df6]//Onde : 0 = Corrente, 1 = A, 2 = B,...[/color:e5b9054df6][/b:e5b9054df6]
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;
[/quote:e5b9054df6]


GOSTEI 0
Martins

Martins

31/10/2005

[quote:7dcc07a5a2=´Adriano Santos´]
Iria sugerir mais ou menos isso q o Massuda, postou, não esatamente com tantos detalhes, outra coisa, Marco, vc vai gravar em disquete não é isso? pois bem, o parametro passado para DiskFree está errado se for para verificar o disquete, pq deveria estar assim DiskFree(1). Ou então estou sem entender a situação. Parametros do DiskFree: 0 = Corrente 1 = A 2 = B


Foi o que eu postei lá em cima logo no comecinho da discussão.

[quote:7dcc07a5a2=´Adriano Santos´]Sendo mais detalhista, pegai.

[quote=Adriano Santos]
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);
[b:7dcc07a5a2][color=red:7dcc07a5a2]//Onde : 0 = Corrente, 1 = A, 2 = B,...[/color:7dcc07a5a2][/b:7dcc07a5a2]
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;
[/quote:7dcc07a5a2][/quote:7dcc07a5a2]

Exatamente [b:7dcc07a5a2]Adriano[/b:7dcc07a5a2], desculpe não havia lido seu post inteiro antes, talvez sejam detalhes a serem vistos.

Boa sorte Marco Salles


GOSTEI 0
Adriano Santos

Adriano Santos

31/10/2005

Sem problemas [b:260fc10d81]Martins[/b:260fc10d81], também dei mancada, poderia ter colocado o exemplo já com o parâmetro correto no DiskFree;

[quote:260fc10d81=´Adriano Santos´]
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);
[b:260fc10d81][color=red:260fc10d81]//Onde : 0 = Corrente, 1 = A, 2 = B,...[/color:260fc10d81][/b:260fc10d81]
if Tamanho < ([color=green:260fc10d81][b:260fc10d81]DiskFree(1)[/b:260fc10d81][/color:260fc10d81] 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;
[/quote:260fc10d81]


GOSTEI 0
Marco Salles

Marco Salles

31/10/2005

massuda escreveu :
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...

Certo massuda.. Coloquei o fragmento de codigo de cabeça e isto me passsou despercebido.. Muito obrigado pela colocação

Martins escreveu
pois bem, o parametro passado para DiskFree está errado se for para verificar o disquete, pq deveria estar assim DiskFree(1). Ou então estou sem entender a situação.


Adriano escreveu
Sem problemas Martins, também dei mancada, poderia ter colocado o exemplo já com o parâmetro correto no DiskFree;


eu tb entrei de gaiato nessa ... Ma agora ta tudo resolvido , o erro foi devido a um parametro errado passado..

Muitissimo obrigado a todos.


GOSTEI 0
Martins

Martins

31/10/2005

[quote:f4d1dec7db=´Marco Salles´]massuda escreveu :
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...

Certo massuda.. Coloquei o fragmento de codigo de cabeça e isto me passsou despercebido.. Muito obrigado pela colocação

Martins escreveu
pois bem, o parametro passado para DiskFree está errado se for para verificar o disquete, pq deveria estar assim DiskFree(1). Ou então estou sem entender a situação.


Adriano escreveu
Sem problemas Martins, também dei mancada, poderia ter colocado o exemplo já com o parâmetro correto no DiskFree;


eu tb entrei de gaiato nessa ... Ma agora ta tudo resolvido , o erro foi devido a um parametro errado passado..

Muitissimo obrigado a todos.[/quote:f4d1dec7db]

Blz [b:f4d1dec7db]Marco[/b:f4d1dec7db], agora é só mandar ficha aí no seu programa, boa sorte!!.

[b:f4d1dec7db]Curiosidade:[/b:f4d1dec7db] Era só o parametro do DiskFree()?

Valew!!!


GOSTEI 0
Marco Salles

Marco Salles

31/10/2005

Curiosidade: Era só o parametro do DiskFree()?


No caso do erro apresentado foi.. Com eu disse antes , eu entrei de gaiato no post colacado pelo adriano , onde ele usou o paremetro do diretorio corrente.. E~u não percebi e deu no que deu.

Mas para esclarecer tudo , volto no post do massuda , que refere ao uso ou não da divisão po 1024

massuda postou
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


Então ao inves de usar

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´);


[b:9f5b2bf87b][color=darkred:9f5b2bf87b][size=18:9f5b2bf87b]O Correto sderia isto[/size:9f5b2bf87b][/color:9f5b2bf87b][/b:9f5b2bf87b]

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) ) then 
    begin 
      FileName:=´A:\TesteEmDelphi.txt; 
      AssignFile (LogFile, Filename); 
      Lista.SaveToFile(FileName); 
    end 
  else 
    ShowMessage(´Disco cheio´); 


Seria isto mesmo :?: :?: :?: :?:
[size=12:9f5b2bf87b][/size:9f5b2bf87b]


GOSTEI 0
Martins

Martins

31/10/2005

Blz grande [b:1c400876b0]Marco Salles[/b:1c400876b0]!!!

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

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

  Tamanho := Length(Lista.Text) 

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


Acho q segundo o q foi postado pelo [b:1c400876b0]Massuda[/b:1c400876b0] seria isso mesmo.

Boa sorte


GOSTEI 0
POSTAR