File, Directory, Path

De Banane Atomic
Aller à la navigationAller à la recherche

File

Csharp.svg
// test si un fichier existe
if (File.Exists(@"C:\Dossier\fichier.txt"))

// test si un nom de fichier est valide
if (String.IsNullOrWhiteSpace(fileName) || fileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)

// lire le contenu d'un fichier en mémoire
string content = File.ReadllText(@"C:\Dossier\fichier.txt");

// WriteAllText creates a file, writes the specified string to the file, and then closes the file.
File.WriteAllText(@"C:\Dossier\fichier.txt", "Texte à écrire");

// Create a string array that consists of three lines.
string[] lines = { "First line", "Second line", "Third line" };
// WriteAllLines creates a file, writes a collection of strings to the file, and then closes the file.
File.WriteAllLines(@"C:\Dossier\fichier.txt", lines);

// renommer un fichier. La destination doit être un fichier.
File.Move(@"C:\Dossier\fichier.txt", @"C:\Dossier\fichier2.txt");

// copier un fichier. La destination doit être un fichier.
File.Copy(@"C:\Dossier\fichier.txt", @"C:\Dossier\fichier2.txt");

// If the file to be deleted does not exist, no exception is thrown.
File.Delete(@"C:\Dossier\fichier.txt");

Directory

Csharp.svg
// créer toute l'arborescence
Directory.CreateDirectory("C:\dossier\sous-dossier");

IEnumerable<string> folderPaths = Directory.EnumerateDirectories("/chemin/vers/un/dossier", "*.txt", SearchOption.AllDirectories);
// search pattern: par défaut "*", ne prend pas en charge les regex
//     * -> 0 ou plusieurs caractères
//     ? -> 1 caractère
// enumeration option: par défaut SearchOption.TopDirectoryOnly

string[] folderPaths = Directory.GetDirectories("/chemin/vers/un/dossier", "*", SearchOption.AllDirectories);

string[] filePaths = Directory.GetFiles("/chemin/vers/un/dossier", "*.txt", SearchOption.AllDirectories);

// pour exclure les liens symboliques
string[] folderPaths = new DirectoryInfo("/chemin/vers/un/dossier").GetDirectories()
    .Where(di => !di.Attributes.HasFlag(FileAttributes.ReparsePoint)).Select(di => di.Name);

Path

Csharp.svg
using System.IO;

var filePath = @"C:\Dossier\fichier.txt"

Path.GetDirectoryName(filePath);  // chemin dossier parent  C:\Dossier
Path.GetFileName(Path.GetDirectoryName(filePath));  // nom du dossier parent  Dossier
Path.GetExtension(filePath);  //  .txt
Path.ChangeExtension(filePath, ".bak"); //  C:\Dossier\fichier.bak
Path.GetFileName(filePath);  //  fichier.txt
Path.GetFileNameWithoutExtension(filePath); //  fichier

Path.Combine(@"C:\AutreDossier", "fichier.odt"); //  C:\AutreDossier\fichier.odt
// Concatène le chemin courant avec le chemin relatif
var cheminAbsolu = Path.GetFullPath(cheminRelatif)

Caractères interdits

Csharp.svg
var replacement = "";
var fileName = Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), replacement));

Chemin relatif à partir d'un chemin absolu

Csharp.svg
public static string GetRelativePath(string fromPath, string toPath)
{
    int fromAttr = GetPathAttribute(fromPath);
    int toAttr = GetPathAttribute(toPath);

    StringBuilder path = new StringBuilder(260); // MAX_PATH
    if(PathRelativePathTo(
        path,
        fromPath,
        fromAttr,
        toPath,
        toAttr) == 0)
    {
        throw new ArgumentException("Paths must have a common prefix");
    }
    return path.ToString();
}

private static int GetPathAttribute(string path)
{
    DirectoryInfo di = new DirectoryInfo(path);
    if (di.Exists)
    {
        return FILE_ATTRIBUTE_DIRECTORY;
    }

    FileInfo fi = new FileInfo(path);
    if(fi.Exists)
    {
        return FILE_ATTRIBUTE_NORMAL;
    }

    throw new FileNotFoundException();
}

private const int FILE_ATTRIBUTE_DIRECTORY = 0x10;
private const int FILE_ATTRIBUTE_NORMAL = 0x80;

[DllImport("shlwapi.dll", SetLastError = true)]
private static extern int PathRelativePathTo(StringBuilder pszPath, 
    string pszFrom, int dwAttrFrom, string pszTo, int dwAttrTo);

PathRelativePathTo function

Limitations de Windows

  • Les chemins avec dossiers + fichier sont d'une longueur maximale de 260
  • Les chemins avec dossiers sans fichiers sont d'une longueur maximale de 248 (260-12)

Dossiers spéciaux de Windows

Cs.svg
string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Énumération SpecialFolder Chemin correspondant (7 64bits)
Windows C:\Windows
System C:\Windows\System32
SystemX86 C:\Windows\SysWOW64
UserProfile C:\Users\<User Name>
MyDocuments C:\Users\<User Name>\Documents
ApplicationData C:\Users\<User Name>\AppData\Roaming
LocalApplicationData C:\Users\<User Name>\AppData\Local
InternetCache C:\Users\<User Name>\AppData\Local\Microsoft\Windows\Temporary Internet Files
ProgramFiles C:\Program Files (x86)

WinForm

Ces propriétés ne sont disponible que pour les application WinForm.

Cs.svg
// C:\Users\<User Name>\AppData\Roaming\<Company Name>\<Product Name>\<Product Version>
string path = Application.UserAppDataPath;

// C:\Users\<User Name>\AppData\Local\<Company Name>\<Product Name>\<Product Version>
string path = Application.LocalUserAppDataPath;

Copie récursive d'un dossier

Csharp.svg
private static void DirectoryCopy(string sourcePath, string destinationPath, bool copySubDirectories)
{
    var directory = new DirectoryInfo(sourcePath);
    var directories = directory.GetDirectories();

    if (!directory.Exists)
    {
        throw new DirectoryNotFoundException("Source directory does not exist or could not be found: " + sourcePath);
    }

    // If the destination directory doesn't exist, create it. 
    if (!Directory.Exists(destinationPath))
    {
        Directory.CreateDirectory(destinationPath);
    }

    // Get the files in the directory and copy them to the new location.
    var files = directory.GetFiles();
    foreach (FileInfo file in files)
    {
        string destinationFilePath = Path.Combine(destinationPath, file.Name);
        var destinationFile = new FileInfo(destinationFilePath);
        if (destinationFile == null)
	{
	    file.CopyTo(destinationFilePath, false);
	}
        else if (file.LastWriteTime > destinationFile.LastWriteTime)
	{
            file.CopyTo(destinationFilePath, true);
	}
    }

    // If copying subdirectories, copy them and their contents to new location. 
    if (copySubDirectories)
    {
        foreach (DirectoryInfo subDirectory in directories)
        {
            string destinationFolderPath = Path.Combine(destinationPath, subDirectory.Name);
            DirectoryCopy(subDirectory.FullName, destinationFolderPath, copySubDirectories);
        }
    }
}

Uri et Webdav

Csharp.svg
string path = @"\\serveur@SSL\Webdav\Fichier.txt";
new Uri(path); // UriFormatException: + Invalid URI: The hostname could not be parsed.

// Exception dans les cas suivant

WebBrowser.Source = new Uri(path);
WebBrowser.NavigateToStream((new StreamReader(path)).BaseStream);

XDocument.Load(path);
XDocument.Load(new StreamReader(path));

var xd = new XmlDocument();
xd.Load(path);
xd.Load(new StreamReader(path));