การอ่านไฟล์ที่มี Attribute `Hidden` ใน C# ต้องลบ Attribute Hidden ออกก่อน อ่านเสร็จค่อยเพิ่มกลับ (ถ้าต้องการ)
ขั้นตอนพื้นฐาน
using System;
using System.IO;
public class Program
{
public static void Main()
{
string filePath = @"C:\Temp\myFile.txt";
// 1. สร้าง FileInfo
FileInfo file = new FileInfo(filePath);
// 2. ตรวจสอบและลบ Hidden Attribute
bool wasHidden = (file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden;
if (wasHidden)
{
file.Attributes &= ~FileAttributes.Hidden; // ลบ Hidden Flag
Console.WriteLine("Removed Hidden attribute");
}
try
{
// 3. อ่านไฟล์ปกติ
using (StreamReader sr = new StreamReader(filePath))
{
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
finally
{
// 4. คืน Hidden Attribute (ถ้าเคยเป็น Hidden)
if (wasHidden)
{
file.Refresh(); // Refresh metadata
file.Attributes |= FileAttributes.Hidden; // เพิ่ม Hidden Flag กลับ
Console.WriteLine("Restored Hidden attribute");
}
}
}
}
Bitwise Operations บน FileAttributes
| Operation | Code | คำอธิบาย |
|---|---|---|
| Check Flag | `(attrs & Flag) == Flag` | Bitwise AND |
| Set Flag | `attrs |= Flag` | Bitwise OR |
| Clear Flag | `attrs &= ~Flag` | Bitwise AND NOT |
| Toggle Flag | `attrs ^= Flag` | Bitwise XOR |
อ่านไฟล์ Hidden โดยไม่เปลี่ยน Attribute (Alternative)
// File.OpenText ไม่สนใจ Hidden Attribute
using (StreamReader sr = File.OpenText(filePath))
{
string content = sr.ReadToEnd();
}
// หรือ File.ReadAllText
string content = File.ReadAllText(filePath); // อ่านได้แม้ Hidden
สำคัญ: File.ReadAllText/ReadAllLines ไม่สนใจ Hidden Attribute
เมธอดเหล่านี้อ่านไฟล์ Hidden ได้โดยตรง ไม่ต้องลบ Attribute
// ทั้งคู่นี้ทำงานได้กับ Hidden Files
string text = File.ReadAllText(@"C:\hidden.txt");
string[] lines = File.ReadAllLines(@"C:\hidden.txt");
byte[] bytes = File.ReadAllBytes(@"C:\hidden.txt");
เมื่อไหร่ต้องลบ Hidden Attribute
- ใช้ `FileStream` โดยตรงและต้องการ Write/Modify
- ใช้ API ที่ตรวจสอบ Attribute ก่อน (Rare)
- ต้องการ Enumerate Files ใน Directory (GetFiles ไม่รวม Hidden โดย Default)
Enumerate Hidden Files
// GetFiles ไม่รวม Hidden โดย Default
var allFiles = Directory.GetFiles(path, "*", SearchOption.AllDirectories); // รวม Hidden
var hiddenFiles = Directory.GetFiles(path, "*", new EnumerationOptions
{
AttributesToSkip = FileAttributes.System // Skip System only, Include Hidden
});
Complete Helper Class
public static class HiddenFileHelper
{
public static string ReadAllTextPreservingHidden(string path)
{
var file = new FileInfo(path);
bool wasHidden = file.Attributes.HasFlag(FileAttributes.Hidden);
if (wasHidden)
file.Attributes &= ~FileAttributes.Hidden;
try
{
return File.ReadAllText(path);
}
finally
{
if (wasHidden)
{
file.Refresh();
file.Attributes |= FileAttributes.Hidden;
}
}
}
}