Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เปิดไฟล์ Hidden ใน C# - จัดการ File Attributes

การอ่านไฟล์ที่มี 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

OperationCodeคำอธิบาย
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;
            }
        }
    }
}