web-dev-qa-db-fra.com

Lire le contenu réel du fichier texte à l’aide de FileStream et de ces options c #

J'ai besoin d'ouvrir un fichier texte dans C # à l'aide de FileStream et avec les options mentionnées ci-dessous

var fileStream = new FileStream(filePath, 
                                FileMode.Open, 
                                FileAccess.Read, 
                                FileShare.Read, 64 * 1024,
                               (FileOptions)FILE_FLAG_NO_BUFFERING | 
                                  FileOptions.WriteThrough & FileOptions.SequentialScan);

Le fichier texte contient "1" ou "0" et après avoir obtenu les résultats, je vais assigner le contenu du fichier texte à une variable chaîne. Si vous êtes intéressé, j'ai besoin des options ci-dessus afin d'éviter que Windows ne lise les fichiers texte dans la mémoire cache. 

System.IO.File.ReadAllText()

... n'est pas assez bon.

Est-ce que quelqu'un aurait la gentillesse d'écrire un simple sous-texte qui reprend ces exigences, s'il-vous-plaît, car les exemples que j'ai vus jusqu'à présent impliquent de travailler avec des octets et des tampons (un domaine sur lequel j'ai vraiment besoin de travailler à ce moment-ci) .

Merci

12
user1776480

Peut-être quelque chose comme:

    FileStream fileStream = new FileStream("[path]", FileMode.Open, FileAccess.Read, FileShare.Read, 64 * 1024,
        (FileOptions)0x20000000 | FileOptions.WriteThrough & FileOptions.SequentialScan);

    string fileContents;
    using (StreamReader reader = new StreamReader(fileStream))
    {
        fileContents = reader.ReadToEnd();
    }


    bool assignedvariable = Convert.ToBoolean(fileContents);

«assignvariable» sera vraie si le fichier contient 1 et false s'il contient 0.

Désolé si cela a déjà été répondu, les gens postent très vite ici.

18
TheKingDave

Vous pouvez utiliser un StreamReader pour lire à partir du flux:

string contents;
using(var sr = new StreamReader(fileStream))
{
   contents = sr.ReadToEnd();
}
10
Hans Kesting
File.ReadAllBytes

ou

File.ReadAllText

Les deux utiliseront-ils théoriquement le cache de fichiers Windows.

Lisez ceci pour plus de compréhension et pour certaines des restrictions de FILE_FLAG_NO_BUFFERING et lisez aussi ceci pour une question de pile de flux similaire

3
Paul Zahra

C'est ce que j'ai fait pour lire un tableau d'octets en utilisant FileStream et cela a bien fonctionné. J'ai élargi les espaces de noms pour des raisons de clarté technique. Vous devez choisir les paramètres FileShare et FileAccess selon votre scénario.

    byte[] buffer = null;
    using (System.IO.FileStream stm = new System.IO.FileStream("c:\\YourFile.txt", 
               System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None))
    {
    buffer = new byte[stm.Length];
    stm.Read(buffer, 0, Convert.ToInt32(stm.Length));
    }

Comment lire le contenu du fichier sous forme de chaîne et non d'un tableau d'octets?

 string buffer = null;
 using (System.IO.FileStream stm = new 
     System.IO.FileStream("c:\\YourFile.txt",System.IO.FileMode.Open,  
     System.IO.FileAccess.Read, System.IO.FileShare.None))
     {
         using (System.IO.StreamReader rdr = new System.IO.StreamReader (stm))
         {
                        buffer=rdr.ReadToEnd();
         }
     }

Pourquoi StreamReader est-il préférable à convertir l'octet [] en chaîne en utilisant l'encodage souhaité?

La classe StreamReader est puissante car elle examinera les octets d'en-tête et déterminera le schéma de codage pour vous. Vous n'êtes pas obligé d'utiliser System.Text.Encoding.UTF8.GetString () .

Pourquoi utiliser FileStream et pourquoi pas System.IO.File.ReadAllBytes/ReadAllText? Je voulais un contrôle précis du mécanisme de verrouillage des fichiers. Dans mon scénario, j'avais un processus qui interrogeait un dossier pour les fichiers entrants. Je voulais être sûr que lorsque je lisais le fichier, le processus lent qui se déroulait à l'autre extrémité du fichier était terminé et que le fichier était prêt à être lu et analysé par mon processus.

Quels sont les inconvénients de la lecture du fichier entier comme un seul tableau d'octets? Si vous allez lire un très gros fichier en même temps, vous solliciterez davantage votre RAM. Pensez à une application qui rend des films. Vous avez un fichier de film de 100 Mo. Vous ne voulez pas lire le fichier entier en même temps. Vous préféreriez qu'il soit lu par morceaux de 100 Ko à la fois, restituer les scènes puis passer au morceau suivant. Cela rend votre application plus évolutive. Votre application de film est maintenant plus évolutive. Vous pouvez gérer de très gros films sans courir le risque de l'exception System.IO.OutOfMemoryException.

0
Sau001