Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-03-2014
ebeltete ebeltete is offline
Miembro
 
Registrado: may 2003
Posts: 236
Poder: 21
ebeltete Va por buen camino
leer metadatos en un archivo

Hola amigos del foro. Vuelvo para pedirles ayuda.
Con Delphi 5 estoy trabajando en una aplicacion para leer y escribir metadatos en un archivo, mas precisamente el IDTAG en archivos multimedia. En pricipio lo habia hecho con "TFileStream", pero de esta manera no podia acceder al archivo si estaba siendo usado por otra aplicacion, termine usando "AssignFile" que de esta manera no tengo problema si el archivo esta siendo usado por otro. Pero ahora me encuentro con el problema que cuando el archivo es de "solo lectura" me genera un error (acceso al archivo denegado). Como puedo hacer para no tener este problema? Gracias.
Responder Con Cita
  #2  
Antiguo 25-03-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por ebeltete Ver Mensaje
Pero ahora me encuentro con el problema que cuando el archivo es de "solo lectura" me genera un error (acceso al archivo denegado). Como puedo hacer para no tener este problema? Gracias.
El problema es que si el archivo lo está utilizando otra aplicación no depende de la tuya, sino de cómo lo haya abierto la ora aplicación antes que la tuya.
Estaría bien además que pusieras código para ver cómo estás abriendo el fichero.

Una opción podría ser la de dar la posibilidad de guardar una copia (igual que hacen otros programas) cuando el archivo está siendo utilizado por otra aplicación.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 25-03-2014
ebeltete ebeltete is offline
Miembro
 
Registrado: may 2003
Posts: 236
Poder: 21
ebeltete Va por buen camino
esto es algo de lo que hago:
Código Delphi [-]
procedure TID3Tag.ReadTag;
var
  FTagRecord: ID3Struct;
        F:File;


begin

        AssignFile(F, FFileName);
        Reset(F,1);
        Seek(F,FileSize(F)-SizeOf(FTagRecord));
        BlockRead(F, FTagRecord, SizeOf(FTagRecord));
        CloseFile(F);

        if StrLComp(FTagRecord.Magic, ID3Magic, SizeOf(FTagRecord.Magic))<>0 then
  begin
                FillChar(FTagRecord, SizeOf(FTagRecord), ' ');
                StrLCopy(FTagRecord.Magic, ID3Magic, SizeOf(FTagRecord.Magic));
  end;

  with FTagRecord do
  begin


    FTitle := Trim(Copy(Title, 1, SizeOf(Title)));
    FArtist := Trim(Copy(Artist, 1, SizeOf(Artist)));
    FAlbum := Trim(Copy(Album, 1, SizeOf(Album)));
    FYear := Trim(Copy(Year, 1, SizeOf(Album)));
    FComment := Trim(Copy(Comment, 1, SizeOf(Comment)));
    FGenre := ID3GenreName[Genre];
  end;
Con respecto a que otra aplicacion lo use no es el problema, con AssignFile lo solucione, o sea por mas que otro usuario con otra aplicacion este usando el archivo (por ejemplo en un recurso compartido de red), mi aplicacion lo lee igual.
Ahora cuando el archivo tiene la propiedad "solo lectura" no lo puedo leer dese mi aplicacion.
Con respecto de hacer una copia no lo veo viable porque puede ser un archivo demasiado grande y tardaria demasiado en hacer la copia. Gracias
Responder Con Cita
  #4  
Antiguo 25-03-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por ebeltete Ver Mensaje
...
Con respecto a que otra aplicacion lo use no es el problema, con AssignFile lo solucione, o sea por mas que otro usuario con otra aplicacion este usando el archivo (por ejemplo en un recurso compartido de red), mi aplicacion lo lee igual.
Ahora cuando el archivo tiene la propiedad "solo lectura" no lo puedo leer dese mi aplicacion.
Con respecto de hacer una copia no lo veo viable porque puede ser un archivo demasiado grande y tardaria demasiado en hacer la copia. Gracias
Hola ebeltete.

Opino igual que Neftali, depende de los atributos con haya abierto el archivo la otra aplicación. Si lo hizo omitiendo el modo FILE_SHARE_READ no lo vas a solucionar con AssignFile, cuya función es sólo asociar un nombre externo a una variable de archivo.

De todos modos, fijate si te puede servir el contenido de este enlace: Como leer ficheros de texto que estan siendo usados por otro proceso

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 26-03-2014
ebeltete ebeltete is offline
Miembro
 
Registrado: may 2003
Posts: 236
Poder: 21
ebeltete Va por buen camino
Gracias por sus respuestas, logre hacerlo funcionar con "readfile" y "writefile" quedo algo asi:
Código Delphi [-]
 hFile := createfile(PChar(FFileName), GENERIC_READ or GENERIC_WRITE , FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
        SetFilePointer(hFile,GETFILESIZE(hFile,0)-SizeOf(FTagRecord)-SizeOf(FTagRielli), NIL, FILE_BEGIN);
        IF writefile(hFile, FTagRielli,SizeOf(FTagRecord)+SizeOf(FTagRielli),dwread, nil)=FALSE THEN
        SHOWMESSAGE(FLOATTOSTR(GetLastError));
No funciona bien con "TFileStream" y "AssignFile".
Ahora me encuentro con el problema de que bajo Windows XP funciona perfecto, pero en Windows Vista y seven, no graba el archivo. Lo ejecute como administrador y tampoco. Cambio algo con estas versiones de Win?
Responder Con Cita
  #6  
Antiguo 26-03-2014
ebeltete ebeltete is offline
Miembro
 
Registrado: may 2003
Posts: 236
Poder: 21
ebeltete Va por buen camino
He estado leyendo algo al respecto, y encuentro algo como esto: Createfile falla con Windows 7 no logro entender bien, pero puede ser que Win7 no deja sobreescribir el archivo?
Responder Con Cita
  #7  
Antiguo 16-06-2014
ebeltete ebeltete is offline
Miembro
 
Registrado: may 2003
Posts: 236
Poder: 21
ebeltete Va por buen camino
hola, vuelvo a consultar. Estoy Probando el codigo en Delphi xe6 y no funciona como Delphi 5, me parece que el problema esta en la codificacion de caracteres. Puede ser?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Metadatos en Delphi avechuche Varios 10 19-09-2013 10:10:24
Extrayendo metadatos cesarsoftware Firebird e Interbase 11 26-11-2012 22:32:19
Leer archivo XLS toni.vi Servers 0 14-05-2012 15:36:22
Leer Archivo txt Yssik OOP 5 26-01-2007 16:12:15
Extraer metadatos RONPABLO Firebird e Interbase 2 22-10-2004 20:04:56


La franja horaria es GMT +2. Ahora son las 08:17:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi