FileStream (Clase)
Ensamblado: mscorlib (en mscorlib.dll)
Utilice la clase FileStream para leer, escribir, abrir y cerrar archivos en un sistema de archivos, así como para manipular otros identificadores del sistema operativo relacionados con archivos, incluidos los de canalizaciones, entrada estándar y salida estándar. Puede especificar que las operaciones de lectura y escritura sean sincrónicas o asincrónicas. FileStream almacena en el búfer la entrada y la salida para obtener un mejor rendimiento.
Los objetos FileStream admiten el acceso aleatorio a los archivos mediante el método Seek. Seek permite que se mueva la posición de lectura/escritura a cualquier posición dentro del archivo. Esto se realiza mediante parámetros de punto de referencia de desplazamiento de byte. El desplazamiento de byte es relativo al punto de referencia de búsqueda, que puede ser el comienzo, la posición actual o el final del archivo subyacente, según lo representado por las tres propiedades de la clase SeekOrigin.
Nota |
|---|
| Los archivos de disco siempre admiten el acceso aleatorio. En el momento de la construcción, el valor de la propiedad CanSeek se establece en true o false dependiendo del tipo de archivo subyacente. En concreto, si el tipo de archivo subyacente es FILE_TYPE_DISK, según se define en winbase.h, el valor de la propiedad CanSeek es true. En caso contrario, el valor de la propiedad CanSeek es false. |
Aunque los métodos sincrónicos Read y Write y los métodos asincrónicosBeginRead, BeginWrite, EndRead y EndWrite pueden funcionar tanto en modo sincrónico como asincrónico, el modo afecta al rendimiento de estos métodos. De forma predeterminada, FileStream abre los archivos sincrónicamente, pero proporciona el constructor FileStream(String,FileMode,FileAccess,FileShare,Int32,Boolean) para abrirlos asincrónicamente.
Si un proceso termina con parte de un archivo bloqueado o cierra un archivo que tiene bloqueos pendientes, el comportamiento no estará definido.
Asegúrese de llamar al método Dispose en todos los objetos FileStream, sobre todo en entornos con espacio en disco limitado. La ejecución de operaciones de E/S puede producir una excepción si no hay espacio en disco disponible y no se llama al método Dispose antes de que finalice FileStream.
Para obtener información sobre las operaciones de directorio y otros archivos, vea las clases File, Directory y Path. La clase File es una clase de utilidad con métodos estáticos dedicados principalmente a la creación de objetos FileStream según las rutas de acceso de archivo y la entrada estándar, la salida estándar y los dispositivos de error estándar. La clase MemoryStream crea una secuencia a partir de una matriz de bytes y funciona de manera similar a FileStream.
En la siguiente tabla se muestran ejemplos de otras tareas de E/S típicas o relacionadas.
| Para realizar esta operación... | Vea el ejemplo de este tema... |
|---|---|
| Crear un archivo de texto | |
| Escribir en un archivo de texto | |
| Leer de un archivo de texto | |
| Anexar texto a un archivo | |
| Cambiar de nombre o mover un archivo | |
| Eliminar un archivo | |
| Copiar un archivo | |
| Obtener el tamaño de un archivo | |
| Obtener los atributos de un archivo | |
| Establecer los atributos de un archivo | |
| Determinar si un archivo existe | |
| Leer de un archivo binario | |
| Escribir en un archivo binario | |
| Recuperar una extensión de archivo | |
| Recuperar la ruta de acceso completa de un archivo | |
| Recuperar el nombre de archivo y la extensión de una ruta de acceso | |
| Cambiar la extensión de un archivo |
Detección de cambios de posición en la secuencia
Cuando un objeto FileStream no tiene control exclusivo sobre su identificador, otro subproceso podría tener acceso al identificador del archivo al mismo tiempo y cambiar la posición del puntero de archivos del sistema operativo que está asociado con el identificador del archivo. En este caso, podría verse comprometida la posición almacenada en memoria caché del objeto FileStream, así como los datos almacenados en memoria caché en el búfer. El objeto FileStream realiza comprobaciones de manera rutinaria en los métodos que obtienen acceso al búfer almacenado en memoria caché para garantizar que la posición del identificador del sistema operativo es la misma que la posición almacenada en caché utilizada por el objeto FileStream.
Si se detecta un cambio inesperado en la posición del identificador en una llamada al método Read, .NET Framework descarta el contenido del búfer y vuelve a leer la secuencia del archivo. Esto puede afectar al rendimiento, en función del tamaño del archivo y de cualquier otro proceso que pueda afectar a la posición de la secuencia del archivo.
Si se detecta un cambio inesperado en la posición del identificador en una llamada al método Write, el contenido del búfer se descarta y se produce una excepción IOException.
Un objeto FileStream no tiene control exclusivo sobre su identificador cuando se obtiene acceso a la propiedad SafeFileHandle para exponer el identificador o cuando el objeto FileStream recibe la propiedad SafeFileHandle de su constructor.
En el siguiente ejemplo se muestran algunos de los constructores FileStream.
using System; using System.IO; using System.Text; class Test { public static void Main() { string path = @"c:\temp\MyTest.txt"; // Delete the file if it exists. if (File.Exists(path)) { File.Delete(path); } //Create the file. using (FileStream fs = File.Create(path)) { AddText(fs, "This is some text"); AddText(fs, "This is some more text,"); AddText(fs, "\r\nand this is on a new line"); AddText(fs, "\r\n\r\nThe following is a subset of characters:\r\n"); for (int i=1;i < 120;i++) { AddText(fs, Convert.ToChar(i).ToString()); //Split the output at every 10th character. if (Math.IEEERemainder(Convert.ToDouble(i), 10) == 0) { AddText(fs, "\r\n"); } } } //Open the stream and read it back. using (FileStream fs = File.OpenRead(path)) { byte[] b = new byte[1024]; UTF8Encoding temp = new UTF8Encoding(true); while (fs.Read(b,0,b.Length) > 0) { Console.WriteLine(temp.GetString(b)); } } } private static void AddText(FileStream fs, string value) { byte[] info = new UTF8Encoding(true).GetBytes(value); fs.Write(info, 0, info.Length); } }
import System.*;
import System.IO.*;
import System.Text.*;
class Test
{
public static void main(String[] args)
{
String path = "c:\\temp\\MyTest.txt";
// Delete the file if it exists.
if (File.Exists(path)) {
File.Delete(path);
}
//Create the file.
{
FileStream fs = File.Create(path);
try {
AddText(fs, "This is some text");
AddText(fs, "This is some more text,");
AddText(fs, "\r\nand this is on a new line");
AddText(fs,
"\r\n\r\nThe following is a subset of characters:\r\n");
for (int i = 1; i < 120; i++) {
AddText(fs, System.Convert.ToString((char)i));
//Split the output at every 10th character.
if (Math.IEEEremainder(Convert.ToDouble(i), 10) == 0) {
AddText(fs, "\r\n");
}
}
}
finally {
fs.Dispose();
}
}
//Open the stream and read it back.
{
FileStream fs = File.OpenRead(path);
try {
ubyte b[] = new ubyte[1024];
UTF8Encoding temp = new UTF8Encoding(true);
while (fs.Read(b, 0, b.length) > 0) {
Console.WriteLine(temp.GetString(b));
}
}
finally {
fs.Dispose();
}
}
} //main
private static void AddText(FileStream fs, String value)
{
ubyte info[] = (new UTF8Encoding(true)).GetBytes(value);
fs.Write(info, 0, info.length);
} //AddText
} //Test
En el ejemplo siguiente se abre un archivo o se crea si todavía no existe, y se agrega información al final del archivo.
using System; using System.IO; using System.Text; class FSOpenWrite { public static void Main() { FileStream fs=new FileStream("c:\\Variables.txt", FileMode.Append, FileAccess.Write, FileShare.Write); fs.Close(); StreamWriter sw=new StreamWriter("c:\\Variables.txt", true, Encoding.ASCII); string NextLine="This is the appended line."; sw.Write(NextLine); sw.Close(); } }
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition
.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.
Referencia
FileStream (Miembros)System.IO (Espacio de nombres)
File (Clase)
FileAccess (Enumeración)
FileMode (Enumeración)
FileShare (Enumeración)
Otros recursos
E/S de archivos y secuenciasCómo: Leer texto de un archivo
Cómo: Escribir texto en un archivo
E/S de archivos básica
Cómo: Leer y escribir en un archivo de datos recién creado
