« File, Directory, Path » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
(→File) |
|||
Ligne 1 : | Ligne 1 : | ||
= [https://msdn.microsoft.com/en-us/library/system.io.file(v=vs.110).aspx File] = | = [https://msdn.microsoft.com/en-us/library/system.io.file(v=vs.110).aspx File] = | ||
<kode lang=csharp> | <kode lang=csharp> | ||
// 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. | // WriteAllText creates a file, writes the specified string to the file, and then closes the file. | ||
File.WriteAllText(@"C:\Dossier\fichier.txt", "Texte à écrire"); | File.WriteAllText(@"C:\Dossier\fichier.txt", "Texte à écrire"); | ||
Ligne 8 : | Ligne 17 : | ||
// WriteAllLines creates a file, writes a collection of strings to the file, and then closes the file. | // WriteAllLines creates a file, writes a collection of strings to the file, and then closes the file. | ||
File.WriteAllLines(@"C:\Dossier\fichier.txt", lines); | File.WriteAllLines(@"C:\Dossier\fichier.txt", lines); | ||
// renommer un fichier. La destination doit être un fichier. | // renommer un fichier. La destination doit être un fichier. |
Version du 23 février 2020 à 08:59
File
// 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
// créer toute l'arborescence Directory.CreateDirectory("C:\dossier\sous-dossier"); string[] filePaths = Directory.GetFiles("/chemin/vers/un/dossier", "*.txt", SearchOption.AllDirectories); // filtre: pattern par défaut "*", ne prend pas en charge les regex // * -> 0 ou plusieurs caractères ? -> 1 caractère // option par défaut SearchOption.TopDirectoryOnly string[] folderPaths = Directory.GetDirectories("/chemin/vers/un/dossier", "*", 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
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.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
var replacement = ""; var fileName = Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), replacement)); |
Chemin relatif à partir d'un chemin absolu
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); |
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
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.
// 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
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
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)); |