

[RESUELTO] Atributos de archivos
#1
Posted 24 July 2010 - 02:59 PM

#2
Posted 24 July 2010 - 04:14 PM
Bienvenido a DelphiAccess, espero que este lugar te sea de mucho agrado

Puedes cambiar los atributos de un archivo mediante FileSetAttr. Para ello debes agregar en uses la unidad SysUtils.
De forma similar, para obtener los atributos de un archivo está la función FileGetAttr.
En la ayuda de Delphi hay ejemplos de uso de las funciones FileXxxAttr.
Si tienes más dudas no dudes en consultar.
Saludos,
#3
Posted 24 July 2010 - 04:20 PM
Tengo esta linea:
FileSetAttr( 'Lineas.Strings[i]', faReadOnly or faHidden );
Lo que no se es como realizar lo contrario, sacarle lo solo lectura y hacer que sea visible?
Adios.
#4
Posted 24 July 2010 - 05:16 PM
Entiendo tu duda.
Notarás que la variable que hace de atributo es un integer. Esta variable es por decirlo de un modo, la combinación (suma) de ciertas constantes.
De la ayuda de Delphi se aprecia esto:
faReadOnly $00000001 Read-only files
faHidden $00000002 Hidden files
faSysFile $00000004 System files
faVolumeID $00000008 Volume ID files
faDirectory $00000010 Directory files
faArchive $00000020 Archive files
faAnyFile $0000003F Any file
De modo que para lograr más de un atributo, deben sumarse esos valores. De forma inversa para quitarles ciertos atributos hay que restarles.

En el ejemplo que pones, se le está dando dos atributos: de sólo lectura y escondido. El OR hace de más (+).
Si deseas quitarle estos atributos sin "pisar" o cambiar los restantes puedes hacer algo como esto:
1. Leer los atributos originales con FileGetAttr y guardarlos en una variable.
2. Restarle a dicha variable faReadOnly y faHidden
3. Establecer los atributos con esta variable y FileSetAttr
Espero que se me entienda.
#5
Posted 25 July 2010 - 09:30 AM
Cualquier cosa vuelvo.

#6
Posted 25 July 2010 - 02:56 PM
En el caso de que quiero buscar un archivo, puedo usar esto:
procedure TForm1.Button1Click(Sender: TObject); begin if FileExists(archivos.txt) then ShowMessage('File already exists!') else ShowMessage('This file is unique'); end;
Aclaracion: archivos.txt es un texto donde almaceno varias lineas con las direcciones de archivos, que luego eliminare.
Pero en ves de que me muestre un ShowMessage con cualquiera de los dos casos (lo encuentre o no) quiero que me muestre solo si lo encuentra pero en un Memo, asi puedo ver los archivos que encontro y para lo que quiero la herramienta es mas facil para el usuario. Al ser muchos archivos a buscar es fastidioso el ShowMessage.
Me pueden ayudar con esto?
#7
Posted 25 July 2010 - 03:39 PM
procedure TForm1.Button1Click(Sender: TObject); begin if FileExists(archivos.txt) then memo1.lines.add('File already exists!'); end;
Salud OS
#8
Posted 25 July 2010 - 04:23 PM
A ver si te entendí
delphi
procedure TForm1.Button1Click(Sender: TObject); begin if FileExists(archivos.txt) then memo1.lines.add('File already exists!'); end;
Salud OS
Perfecto me anda bien en esa parte, pero al agregarle para que elimine me salta un error?
if FileExists(archivos) then DeleteFile(archivos); memo1.lines.add(archivos + ' eliminado!');
Te dejo una imagen asi se ve mejor.

#9
Posted 25 July 2010 - 09:22 PM
No tengo idea de porque ese error, solo te diré algo, según tu código lo que haces es:
CASO 1. Si existe el archivo:
1. Preguntas si existe el archivo
2. Si existe lo borras
3. Muestras en el memo el archivo que borraste
CASO 2: NO existe el archivo:
1. Preguntas si existe el archivo
2. Si NO existe, muestras en el memo el archivo que NO existe
Yo haría lo siguiente para mostrar solo cuando el archivo SI existe.
if FileExists(archivos) then begin DeleteFile(archivos); memo1.lines.add(archivos + ' eliminado!'); end;
O si quieres mostrar un mensaje de que no existe el archivo, puedes hacer esto.
if FileExists(archivos) then begin DeleteFile(archivos); memo1.lines.add(archivos + ' eliminado!'); end else begin memo1.lines.add('No existe el archivo'); end;
Salud OS
#10
Posted 26 July 2010 - 07:50 AM
if FileExists(archivos) then begin DeleteFile(archivos); memo1.lines.add(archivos + ' eliminado!'); end;
Muchas gracias de nuevo.

#11
Posted 26 July 2010 - 09:27 AM
A veces puede que no se llegue a borrar el archivo porque está siendo usado por otro proceso. Si realmente lo que quieres mostrar es que un archivo se ha borrado, creo que deberías de hacer algo así
if DeleteFile(archivos) then memo1.lines.add(archivos + ' eliminado!');
Con esto, realmente te da lo mismo si el archivo existe o no, con lo que puedes ahorrarte esa comparación. En el caso de que no exista, DeleteFile devolverá 0 (o false) y, si existe y se ha podido borrar, devolverá un valor diferente de 0 o True.
Si además quieres saber el motivo por el cual no ha podido borrarse (que no exista, que esté siendo usado por otro proceso,...), siempre puedes usar la función GetLastError.
Espero que te sirva
Nos leemos
#12
Posted 26 July 2010 - 09:56 AM
Para eliminar las demas lineas despues uso.
Memo1.Lines.Clear;
cadetill gracias por tu sugerencia ya la implemente, tenes razon asi ahorro recursos, y el trabajo es el mismo.
Salu2.
#13
Posted 26 July 2010 - 10:01 AM
Para limpiar la primera línea que dice "memo1", simplemente debes de entrar la opción Lines en el Object Inspector (en tiempo de Diseño) y quitar el texto.
#14
Posted 26 July 2010 - 10:01 AM
Saludos.
PD. 10 segundos Rolphy, 10 segundos

#15
Posted 26 July 2010 - 10:24 AM
Salu2.
#16
Posted 27 July 2010 - 01:20 PM
Tengo problemas para que haga los saltos con cada escritura y lea todas las lineas.
Salu2.
#17
Posted 27 July 2010 - 06:18 PM
En un bloc de notas como puedo escribir un listado usando Lineas.Strings[i] ?
Tengo problemas para que haga los saltos con cada escritura y lea todas las lineas.
Salu2.
Saludos.
Si vas a escribir un nuevo "problema" distinto al existente lo recomendable es que abras un nuevo hilo, así es más fácil darle seguimiento tanto tú como los demás.
P.D. El hilo ya personalmente lo había marcado como resuelto a razón de que tu último post esta marcado como resuelto. ¿Porque cambiar el estado?
#18
Posted 27 July 2010 - 06:41 PM
Moves el post en un nuevo tema o creo uno yo?
Salu2.
#19
Posted 27 July 2010 - 06:43 PM
Tienes razon perdona las molestias.
Moves el post en un nuevo tema o creo uno yo?
Salu2.
Saludos.
Creo que lo recomendable es que seas tú mismo quien cree el hilo nuevo, eres él único que conoce el problema y por ende puedes darnos todos los detalles para nosotros tratar de ayudarte.
