Rapide en lecture/écriture à partir d'un fichier en delphi
Je suis le chargement d'un fichier dans un tableau sous forme binaire, ce qui semble prendre un certain temps
est-il un meilleur, plus rapide, efficace façon de le faire.
je suis l'aide d'une méthode similaire pour l'écriture dans le fichier.
procedure openfile(fname:string);
var
myfile: file;
filesizevalue,i:integer;
begin
assignfile(myfile,fname);
filesizevalue:=GetFileSize(fname); //my method
SetLength(dataarray, filesizevalue);
i:=0;
Reset(myFile, 1);
while not Eof(myFile) do
begin
BlockRead(myfile,dataarray[i], 1);
i:=i+1;
end;
CloseFile(myfile);
end;
Veuillez reformater, c'est dur à lire
OriginalL'auteur Arthur | 2009-01-18
Vous devez vous connecter pour publier un commentaire.
En général, vous ne devriez pas lire les fichiers octet par octet. Utilisation BlockRead avec une valeur plus grande (512 ou 1024 sont souvent les meilleures) et utiliser sa valeur de retour pour savoir combien d'octets ont été lus.
Si la taille n'est pas trop grand (et votre utilisation de SetLength semble pour cela), vous pouvez également utiliser un BlockRead appel de lire le dossier complet à la fois. Ainsi, la modification de votre approche, ce serait:
Peut-être vous pouvez également modifier la procédure pour une fonction booléenne nommée OpenAndReadFile et retourne false si le fichier n'a pas pu être ouvert ou lu.
Oui, c'est une faute de frappe. Il devrait être filesizevalue, sachez également que votre tableau doit être un tableau de byte.
Fixe maintenant. Il semble qu'il doit être dataarray[0], trop.
OriginalL'auteur schnaader
Si votre vraiment envie de lire un fichier binaire rapide, laissez windows vous soucier de mise en mémoire tampon 😉 à l'aide de Les Fichiers Mappés En Mémoire. En utilisant cela, vous pouvez simple carte d'un fichier à un emplacement de la mémoire en lecture comme c'est un tableau.
Votre fonction devient:
Mais je suggère de ne pas utiliser la variable globale
dataarray
, mais soit passer comme un var dans le paramètre, ou utiliser une fonction qui retourne le tableau résultant.La TMappedFile est de mon article La lecture rapide des fichiers à l'aide du Mappage de la Mémoire, cet article contient également un exemple de la façon de l'utiliser pour les plus "avancées" des fichiers binaires.
OriginalL'auteur Davy Landman
Elle dépend du format de fichier. Si elle se compose de plusieurs enregistrements identiques, vous pouvez décider de créer un fichier de ce type d'enregistrement.
Par exemple:
OriginalL'auteur Toon Krijthe
Si c'est un assez long fichier lecture de cette manière prend beaucoup de temps, j'aimerais utiliser un flux à la place. Le bloc de lecture sera beaucoup plus rapide, et il n'y a pas de boucles de s'inquiéter. Quelque chose comme ceci:
Il apparaît à partir de votre code de votre taille d'enregistrement est de 1 octet de long. Si non, alors le changement de la ligne de lecture:
ou quelque chose de similaire.
OriginalL'auteur Mason Wheeler
Recherchez un tampon de TStream descendant. Il fera de votre code beaucoup plus rapide que la lecture du disque est fait rapidement, mais vous pouvez faire une boucle à travers le tampon facilement. Il y a de divers sujet, ou vous pouvez écrire votre propre.
OriginalL'auteur mj2008
Si vous vous sentez très bitheaded, vous pouvez contourner Win32 complètement et d'appeler le NT API Native de la fonction ZwOpenFile (), qui, dans mes tests informelle n'raser un petit peu. Sinon, j'ai utiliser Davy du Fichier Mappé en Mémoire de la solution ci-dessus.
OriginalL'auteur Jesse C. Slicer