Trois types de fichiers utilisés pour la lecture et l'écriture (E/S) dans Delphi
1. Ancien type de fichier Pascal
Types de fichiers représentés par d'anciennes variables de fichier, telles que F:text, F:File. Trois catégories sont définies : typé, non typé, type de caractère et certaines fonctions d'opération de fichier Delphi Par exemple : AssignPRn, Writeln, ces classes de fichiers sont similaires à Windows. Le descripteur de fichier est incompatible
2. Descripteur de fichier Windows (handle)
Le handle de fichier Pascal orienté objet encapsule le type de handle de fichier Windows et la bibliothèque de fonctions d’opération de fichier encapsule la fonction API Windows. Par exemple, « Fileread » appelle la fonction API Windows « ReadFile ». Delphi fournit une interface d’opération API Windows. Si vous connaissez l'API Windows, vous pouvez utiliser les instructions de fichier Windows pour effectuer des opérations sur les fichiers.
3. Flux de fichiers
Le flux de fichiers est une instance d'objet de la classe TFileStream. Le flux de fichiers est un type d'opération de fichier de haut niveau qui fournit un attribut de handle. Cet attribut peut être utilisé pour exploiter les types de handle de fichier Windows.
Comment choisir un type de fichier
Le handle de fichier Windows est un type d’opération de fichier de niveau inférieur qui fournit un contrôle flexible de lecture et d’écriture de fichiers synchrones et asynchrones. Ce qui suit fournit une description de pseudo-code de la synchronisation de fichiers et du fonctionnement asynchrone à l’aide du type de handle de fichier Windows :
Opérations synchrones :
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL);
// vérifie eof
if (bResult && nBytesRead == 0, ) {
// nous sommes à la fin du fichier
}
Opérations asynchrones :
// configure les champs de structure superposés
gOverLapped.Offset = 0 ;
gOverLapped.OffsetHigh = 0 ;
gOverLapped.hEvent = NULL ;
// tentative d'une opération de lecture asynchrone
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead,
&gChevauché) ;
// s'il y a eu un problème, ou si l'opération asynchrone est toujours en attente...
si (!bRésultat)
{
// gère le code d'erreur
commutateur (dwError = GetLastError())
{
cas ERROR_HANDLE_EOF :
{
// on arrive à la fin du fichier
//lors de l'appel à ReadFile
// code pour gérer ça
}
cas ERROR_IO_PENDING :
{
// les E/S asynchrones sont toujours en cours
// fait autre chose pendant un moment
GoDoSomethingElse() ;
// vérification des résultats de la lecture asynchrone
bResult = GetOverlappedResult(hFichier, &gOverlapped,
&nBytesLecture, FALSE) ;
// s'il y avait un problème...
si (!bRésultat)
{
// gère le code d'erreur
commutateur (dwError = GetLastError())
{
cas ERROR_HANDLE_EOF :
{
// on arrive à la fin du fichier
fichier pendant un fonctionnement asynchrone
}
// gère d'autres cas d'erreur
}
}
} // fin du cas
// gère d'autres cas d'erreur
} // commutateur de fin
} // termine si
Bien que les descripteurs de fichiers Windows offrent un contrôle de fichier flexible, davantage de code de gestion des erreurs doit être écrit.
Si vous n'êtes pas familier avec l'API Windows, utilisez l'ancien type de variable de fichier recommandé par Delphi.
L'ancien type de fichier de Delphi utilise AssignFile pour associer des variables de fichier aux fichiers physiques, définis par Delphi
Diverses opérations sur les variables de fichier pour compléter l'accès et l'exploitation des fichiers. Facile à utiliser. Ce qui suit fournit la classe de variables de fichier.
Description du code d'opération de type :
var
F : Fichier texte ;
S : chaîne ;
commencer
si OpenDialog1.Execute alors { Afficher la boîte de dialogue Ouvrir }
commencer
AssignFile(F, OpenDialog1.FileName); { Fichier sélectionné dans la boîte de dialogue }
Réinitialiser (F);
Readln(F, S); { Lire la première ligne du fichier }
Edit1.Text := S; { Mettre la chaîne dans un contrôle TEdit }
FermerFichier(F);
fin;
fin;
Le flux de fichiers est une sous-classe de flux (classes de flux), donc l'un des avantages de son utilisation est qu'il peut automatiquement hériter des propriétés de sa classe parent. Il peut facilement interagir avec d'autres classes de flux, par exemple si vous souhaitez écrire une dynamique. bloc de mémoire Dans le disque, vous pouvez utiliser un TFileStream et un TMemoryStream pour terminer.