OneDrive "ไฟล์ตามความต้องการ" กับแอปธุรกิจ — ข้อสมมติที่เพลสโฮลเดอร์ทำลาย และวิธีรับมือ

· · OneDrive, ไฟล์ตามความต้องการ, KFM, Windows, แอปธุรกิจ, ที่เก็บคลาวด์, ระบบไฟล์, การแก้ปัญหา, ระบบสารสนเทศ

“แอปธุรกิจอ่าน CSV ที่บันทึกบนเดสก์ท็อปไม่ได้” “การนำเข้าที่เคยทำงาน ล้มเหลวด้วย ‘ไม่พบไฟล์’ หลังเปลี่ยนพีซี” “Explorer เห็นไฟล์ แต่เปิดจากแอปแล้วผิดพลาด” — ไม่กี่ปีมานี้ การปรึกษาแบบนี้จากลูกค้ากลายเป็นเรื่องประจำ

เมื่อสืบสวน สาเหตุมักไม่ใช่บั๊กของแอป แต่เป็น “การสำรองเดสก์ท็อปและเอกสารอัตโนมัติ” ของ OneDrive (Known Folder Move, KFM) และ “ไฟล์ตามความต้องการ” เดสก์ท็อปจริงย้ายไปที่ C:\Users\<ชื่อ>\OneDrive\Desktop และไฟล์บางส่วนที่เห็นที่นั่นคือ “เพลสโฮลเดอร์” ที่ไม่มีเนื้อหาในเครื่อง ผู้ใช้และไอทียังใช้พีซีต่อไปโดยไม่สังเกตการเปลี่ยนแปลงนี้

กล่าวอีกอย่าง ข้อสมมติโดยนัยของแอปธุรกิจที่ว่า “ไฟล์อยู่บนดิสก์ในเครื่อง” ได้ถูกแทนที่ โดยไม่มีใครตัดสินใจ ด้วยข้อสมมติที่ว่า “ไฟล์อยู่ในคลาวด์ และในเครื่องมีแค่รูปลักษณ์” มุ่งที่เจ้าหน้าที่ไอทีของธุรกิจขนาดกลางและเล็ก และนักพัฒนาแอป Windows บทความนี้จัดระเบียบจากแหล่งปฐมภูมิของ Microsoft Learn ว่าเพลสโฮลเดอร์ทำงานอย่างไร วิธีตัดสินสถานะจากแอตทริบิวต์ไฟล์ กับดักแบบฉบับที่แอปธุรกิจเหยียบ สิ่งที่ฝ่ายพัฒนาและฝ่ายไอทีทำได้ และขั้นตอนคัดกรองเมื่อถูกถามว่า “ไฟล์เปิดไม่ได้”

การแทนที่ข้อสมมติโดยนัยของแอปธุรกิจข้อสมมติโดยนัยของแอปธุรกิจว่าไฟล์อยู่บนดิสก์ในเครื่องได้ถูกแทนที่โดยไม่มีใครตัดสินใจ ด้วยข้อสมมติว่าเนื้อหาจริงอยู่ในคลาวด์ และในเครื่องมีแค่รูปลักษณ์ข้อสมมติโดยนัยแบบเดิมเนื้อหาจริงบนดิสก์ในเครื่องข้อสมมติที่ถูกแทนที่เนื้อหาจริงอยู่ในคลาวด์ในเครื่องมีแค่รูปลักษณ์เพลสโฮลเดอร์

ภาพ 1: ข้อสมมติที่ว่า “เนื้อหาจริงอยู่ที่เครื่อง” ได้ถูกแทนที่ โดยไม่มีใครตัดสินใจ ด้วย “เนื้อหาจริงอยู่ในคลาวด์ ในเครื่องมีแค่รูปลักษณ์”

1. สรุปก่อน

  • เดสก์ท็อป เอกสาร และรูปภาพอาจถูก KFM ย้ายไปใต้ C:\Users\<ชื่อ>\OneDrive\ มักถูกเปิดตอนตั้งค่าเริ่มต้นของพีซีใหม่ และองค์กรก็ใช้โยบายบังคับเป็นชุดได้ แอปที่สมมติพาธคงที่จะพังตรงนี้1
  • ไฟล์ตามความต้องการเปิดเป็นค่าเริ่มต้นในแอปซิงค์ปัจจุบัน ไฟล์ที่สร้างบนอุปกรณ์อื่นหรือบนเว็บปรากฏเป็นเพลสโฮลเดอร์ “ออนไลน์อย่างเดียว” ที่ไม่มีเนื้อหาในเครื่อง23
  • ตัวตนจริงของเพลสโฮลเดอร์คือจุดรีพาร์สที่ Cloud Files API จัดการ (มินิฟิลเตอร์ cldflt.sys) ทั้ง Explorer และ API ไฟล์มองว่าเป็นไฟล์ธรรมดา และการเปิดจะดาวน์โหลด (ไฮเดรต) อัตโนมัติ4
  • สถานะตัดสินจากแอตทริบิวต์ไฟล์ได้ FILE_ATTRIBUTE_OFFLINE, RECALL_ON_DATA_ACCESS, PINNED, UNPINNED และคล้ายกันคือเครื่องหมาย คำสั่ง attrib แสดงเป็นตัวอักษร O, P และ U การตรวจแอตทริบิวต์อย่างเดียวไม่ทำให้ดาวน์โหลด567
  • อุบัติเหตุแบบฉบับของแอปธุรกิจคือการรวมกันของ “เปิดไม่ได้” “ช้า” “ตัดสินแอตทริบิวต์ผิด” “พายุเหตุการณ์เฝ้าดู” และ “ชนกับการซิงค์” ออฟไลน์หรือเมื่อ OneDrive หยุด ไฮเดรชันล้มเหลว และกระบวนการแบตช์ชักนำการดาวน์โหลดทุกไฟล์48
  • การตอบสนองฝ่ายแอปคือ “เคารพเพลสโฮลเดอร์” พื้นฐานคือตัดสินจากแอตทริบิวต์ตอนแจกแจงและไม่เปิดมั่ว ใช้ FILE_FLAG_OPEN_NO_RECALL หากจำเป็น และไม่วางโฟลเดอร์ข้อมูลใต้ OneDrive910
  • การตอบสนองฝ่ายไอทีคือ “ปฏิบัติการด้วยพิน” และ “ควบคุมด้วยนโยบาย” รับประกันเนื้อหาจริงของโฟลเดอร์ธุรกิจด้วย “เก็บไว้ในอุปกรณ์นี้เสมอ” และตั้งค่า KFM กับไฟล์ตามความต้องการโดยเจตนาด้วยนโยบายกลุ่ม / Intune อย่าลืมว่า Storage Sense ก็ “คืนไฟล์ที่ไม่ได้ใช้เป็นออนไลน์อย่างเดียว” ได้1112

ประโยคเดียว: “ไฟล์ที่เห็นใน Explorer” กับ “ไฟล์ที่มีเนื้อหาจริงบนดิสก์ในเครื่อง” ไม่ใช่สิ่งเดียวกันอีกต่อไป

2. สิ่งที่กำลังเกิด — KFM และไฟล์ตามความต้องการ

2.1. เดสก์ท็อปอาจไม่ใช่ C:\Users\<ชื่อ>\Desktop อีกแล้ว

แอปซิงค์ OneDrive มีฟีเจอร์ชื่อ Known Folder Move (KFM) บนหน้าจอการตั้งค่าแสดงเป็น “สำรอง” “สำรองโฟลเดอร์สำคัญ” และคล้ายกัน เมื่อเปิด เดสก์ท็อป เอกสาร และรูปภาพจริงจะถูกย้าย (เปลี่ยนทิศ) ไปใต้โฟลเดอร์ OneDrive1

ที่ผู้ใช้เห็น พาธจริงก่อน KFM พาธจริงหลัง KFM
เดสก์ท็อป C:\Users\taro\Desktop C:\Users\taro\OneDrive\Desktop
เอกสาร C:\Users\taro\Documents C:\Users\taro\OneDrive\Documents
รูปภาพ C:\Users\taro\Pictures C:\Users\taro\OneDrive\Pictures

ตอนตั้งค่าเริ่มต้น (OOBE) ของพีซีใหม่ การลงชื่อเข้าด้วยบัญชี Microsoft หรือบัญชีงานมักเสนอการสำรองโฟลเดอร์เป็นข้อเสนอเริ่มต้น และการเดินหน้าตามนั้นจะเปิดมัน องค์กรก็ บังคับเป็นชุดโดยไม่ถามผู้ใช้ ด้วยนโยบาย “ย้ายโฟลเดอร์ที่รู้จักของ Windows ไป OneDrive แบบเงียบ” (KFMSilentOptIn) ได้111

สองทางที่ KFM ถูกเปิดการลงชื่อเข้าด้วยบัญชีตอนตั้งค่าเริ่มต้นพีซีใหม่เสนอการสำรองโฟลเดอร์เป็นข้อเสนอเริ่มต้นและการเดินหน้าตามนั้นจะเปิดมัน ในองค์กรนโยบาย KFMSilentOptIn บังคับเป็นชุดโดยไม่ถามผู้ใช้ตั้งค่าเริ่มต้นของพีซีใหม่ลงชื่อเข้าด้วยบัญชีสำรองถูกเสนอเป็นค่าเริ่มต้นเดินหน้าตามนั้นแล้วเปิดนโยบายองค์กรKFMSilentOptInบังคับเป็นชุดโดยไม่ถามKFM เปิด

ภาพ 2: KFM ถูกเปิดโดยไม่มีใครสังเกต ทั้งจากข้อเสนอเริ่มต้นตอนตั้งค่าแรก หรือจากนโยบายบังคับเงียบขององค์กร

จุดอึดอัดคือ รูปลักษณ์ใน Explorer แทบไม่เปลี่ยน API โฟลเดอร์ที่รู้จักของเชลล์ (SHGetKnownFolderPath และ Environment.GetFolderPath ของ .NET) คืนพาธที่ถูกต้องหลังย้าย ดังนั้นแอปที่สุภาพยังทำงานต่อ สิ่งที่พังคือแอปที่ ฝังพาธคงที่อย่าง C:\Users\%USERNAME%\Desktop ในไฟล์ตั้งค่าหรือในโค้ด รูปแบบแบบฉบับที่การนำเข้าล้มเหลวด้วย “ไม่พบไฟล์” หลังเปลี่ยนพีซีคืออันนี้

พฤติกรรมการถอดพาธของแอปหลัง KFMหลัง KFM ย้ายเดสก์ท็อปจริงและโฟลเดอร์คล้ายกันไปใต้ OneDrive แอปที่ใช้ API โฟลเดอร์ที่รู้จักยังทำงานด้วยพาธที่ถูกต้องหลังย้าย แต่แอปที่ฝังพาธคงที่จะล้มเหลวด้วยไม่พบไฟล์API โฟลเดอร์ที่รู้จักพาธคงที่ที่ฮาร์ดโค้ดKFM ถูกเปิดเดสก์ท็อปจริงและคล้ายกันย้ายไปใต้ OneDriveแอปถอดพาธอย่างไร?ได้พาธที่ถูกต้องหลังย้ายและทำงานต่อไม่พบไฟล์

ภาพ 3: หลัง KFM แอปที่ใช้ API โฟลเดอร์ที่รู้จักยังทำงาน แต่แอปที่ฮาร์ดโค้ดพาธคงที่จะพังตรงนี้

2.2. ไฟล์ตามความต้องการ — เห็น แต่ไม่มีเนื้อหาจริง

อีกเส้นคือไฟล์ตามความต้องการ ในสภาพแวดล้อมที่เปิด ทุกไฟล์บน OneDrive เห็นใน Explorer แต่ เนื้อหาไม่ถูกดาวน์โหลดจนกว่าจะเปิดไฟล์ ฟีเจอร์นี้เปิดเป็นค่าเริ่มต้นในแอปซิงค์ปัจจุบัน และ Microsoft ก็แนะนำให้เปิดทิ้งไว้23

สถานะอ่านจากไอคอนสถานะใน Explorer ได้13

ไอคอน สถานะ เนื้อหาในเครื่อง
เครื่องหมายเมฆ ออนไลน์อย่างเดียว ไม่มี (มีแค่เพลสโฮลเดอร์)
ถูกบนพื้นขาว พร้อมใช้ในเครื่อง มี (แต่ภายหลังอาจถูกปล่อยอัตโนมัติ)
ถูกขาวบนพื้นเขียว เก็บไว้ในอุปกรณ์นี้เสมอ (ปักหมุด) มี (นอกการปล่อยอัตโนมัติ)

ที่สำคัญที่นี่คือสถานะกลาง ไฟล์ที่เปิดครั้งหนึ่งแล้วมีเนื้อหาในเครื่องอาจ กลับเป็นออนไลน์อย่างเดียว ผ่านการกระทำ “เพิ่มเนื้อที่ว่าง” ของผู้ใช้ หรือผ่าน Storage Sense ที่จะพูดทีหลัง นั่นเป็นสาเหตุหนึ่งของความล้มเหลวที่ทำซ้ำยากแบบ “เดือนที่แล้วยังใช้ได้”312

สามสถานะของไฟล์ตามความต้องการและการเปลี่ยนไฟล์ออนไลน์อย่างเดียวกลายเป็นพร้อมใช้ในเครื่องเมื่อเปิด แต่เพิ่มเนื้อที่ว่างหรือ Storage Sense อาจคืนเป็นออนไลน์อย่างเดียว และเฉพาะไฟล์ที่ปักหมุดอยู่นอกการปล่อยอัตโนมัติเปิด (ไฮเดรชัน)เพิ่มเนื้อที่ว่างStorage Senseเก็บไว้ในอุปกรณ์นี้เสมอเก็บไว้ในอุปกรณ์นี้เสมอถอนพินออนไลน์อย่างเดียว (เครื่องหมายเมฆ)พร้อมใช้ในเครื่องปักหมุด (เก็บไว้ในอุปกรณ์นี้เสมอ)

ภาพ 4: สามสถานะของไฟล์ตามความต้องการ “พร้อมใช้ในเครื่อง” อาจกลับเป็นออนไลน์อย่างเดียวอัตโนมัติ พินอยู่นอกนั้น

3. ตัวตนจริงของเพลสโฮลเดอร์ — Cloud Files API และจุดรีพาร์ส

ไฟล์ตามความต้องการถูกทำให้บนกลไก OS ที่นำเข้าใน Windows 10 เวอร์ชัน 1709 คือ Cloud Files API หน่วยทำงานฝั่งระบบไฟล์คือมินิฟิลเตอร์ระบบไฟล์ชื่อ cldflt.sys (ชื่อบริการ CldFlt, “Windows Cloud Files Filter Driver”) และ OneDrive คือหนึ่งใน “ผู้ให้บริการซิงค์” ที่ใช้ API นี้47

เพลสโฮลเดอร์ในทางเทคนิคคือ จุดรีพาร์ส บนระบบไฟล์มีแค่เมทาดาทาอย่างชื่อ ขนาด และประทับเวลา (ราว 1KB) ไม่มีข้อมูลเนื้อหา เมื่อแอปเปิดไฟล์และอ่าน มินิฟิลเตอร์ตรวจจับคำขอ บอกผู้ให้บริการซิงค์ให้ถ่ายโอนข้อมูล รอให้ดาวน์โหลดจบ แล้วการอ่านจึงเดินต่อ การดึงนี้เรียก ไฮเดรชัน การทิ้งเนื้อหาในเครื่องแล้วกลับเป็นเพลสโฮลเดอร์เรียก ดีไฮเดรชัน4

ไฮเดรชันเมื่อเปิดเพลสโฮลเดอร์เมื่อแอปเปิดเพลสโฮลเดอร์และอ่าน มินิฟิลเตอร์ cldflt.sys ตรวจจับคำขอ บอกผู้ให้บริการซิงค์ให้ถ่ายโอนข้อมูล รอให้ดาวน์โหลดจบ แล้วการอ่านจึงเดินต่อผู้ให้บริการซิงค์มินิฟิลเตอร์ cldflt.sysแอปธุรกิจผู้ให้บริการซิงค์มินิฟิลเตอร์ cldflt.sysแอปธุรกิจคำขอเปิดและอ่านสั่งถ่ายโอนข้อมูลดาวน์โหลดเสร็จการอ่านเดินต่อ

ภาพ 5: การอ่านเพลสโฮลเดอร์เดินต่อหลังมินิฟิลเตอร์ให้ผู้ให้บริการซิงค์ดึงข้อมูลแล้ว

ได้ยิน “จุดรีพาร์ส” แล้วกังวลเรื่องความเข้ากันได้กับโค้ดเดิมที่ “ปฏิบัติพิเศษเมื่อตรวจพบจุดรีพาร์ส” แต่เพื่อความเข้ากันได้ Cloud Files API ซ่อนความจริงว่าเป็นจุดรีพาร์สจากทุกคนยกเว้นเอนจินซิงค์และโพรเซสใต้ %systemroot% จากแอปธรรมดา มันดูเหมือน “ไฟล์ธรรมดาที่เปิดช้าไปนิด” ความโปร่งใสขนาดนั้นสะดวก และก็เป็นเหตุที่ “แอปถูกทำลายข้อสมมติโดยไม่รู้ตัว”4 กลไกของจุดรีพาร์สเองอธิบายใน “NTFS Internals

การซ่อนจุดรีพาร์ส และความต่างของรูปลักษณ์ตัวตนจริงของเพลสโฮลเดอร์คือจุดรีพาร์ส แต่ Cloud Files API ซ่อนจากโพรเซสอื่นนอกเอนจินซิงค์ จึงดูจากแอปธรรมดาเหมือนไฟล์ธรรมดาที่เปิดช้าไปนิดเอนจินซิงค์และคล้ายกันแอปอื่นใดเพลสโฮลเดอร์ (จุดรีพาร์ส)โพรเซสไหนเปิด?เห็นเป็นจุดรีพาร์สดูเหมือนไฟล์ธรรมดาดูแค่เปิดช้าไปนิด

ภาพ 6: ความจริงว่าเป็นจุดรีพาร์สถูกซ่อนจากทุกคนยกเว้นเอนจินซิงค์ และต่อแอปธรรมดาดูเหมือนไฟล์ธรรมดา

ในคุณสมบัติของ Explorer เพลสโฮลเดอร์มีลักษณะว่า “ขนาด” แสดงขนาดต้นฉบับ ในขณะที่ “ขนาดบนดิสก์” เกือบ 0 ข้อสมมติที่ว่า “มีขนาด จึงต้องมีเนื้อหาจริง” ไม่ยืนตรงนี้

เพลสโฮลเดอร์ดูอย่างไรในคุณสมบัติในคุณสมบัติ Explorer เพลสโฮลเดอร์แสดงขนาดต้นฉบับเป็นขนาด ในขณะที่ขนาดบนดิสก์เกือบ 0 จึงข้อสมมติว่ามีขนาดแล้วต้องมีเนื้อหาจริงไม่ยืนคุณสมบัติเพลสโฮลเดอร์ขนาดคือขนาดต้นฉบับขนาดบนดิสก์เกือบ 0ข้อสมมติว่าต้องมีเนื้อหาจริงไม่มีเนื้อหาในเครื่อง

ภาพ 7: เพลสโฮลเดอร์แสดงขนาดต้นฉบับเป็น “ขนาด” ในขณะที่ “ขนาดบนดิสก์” เกือบ 0

4. แอตทริบิวต์ไฟล์บอกสถานะ

สถานะเพลสโฮลเดอร์ถูกเผยเป็นแอตทริบิวต์ไฟล์ธรรมดา ตัวหลักมีดังนี้5

แอตทริบิวต์ ค่า ความหมาย
FILE_ATTRIBUTE_OFFLINE 0x00001000 ข้อมูลไม่พร้อมทันที (แอตทริบิวต์ดั้งเดิมของการจัดการที่เก็บแบบลำดับชั้น)
FILE_ATTRIBUTE_RECALL_ON_OPEN 0x00040000 ไม่มีเนื้อหาในเครื่องทางกายภาพ ปรากฏเฉพาะในผลการแจกแจงไดเรกทอรี
FILE_ATTRIBUTE_PINNED 0x00080000 ผู้ใช้ตั้งใจ “เก็บไว้ในเครื่องเสมอ” (ปักหมุด)
FILE_ATTRIBUTE_UNPINNED 0x00100000 ไม่ต้องเก็บเนื้อหาในเครื่อง (เจตนาทำให้ออนไลน์อย่างเดียว)
FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS 0x00400000 เนื้อหาบางส่วนหรือทั้งหมดไม่อยู่ในเครื่อง การอ่านทำให้ดึงจากระยะไกล

คำสั่ง attrib ของพร้อมท์คำสั่งแสดงและตั้งค่าเหล่านี้เป็นตัวอักษรเดียวได้ O คือแอตทริบิวต์ออฟไลน์ P คือปักหมุด U คือถอนพิน6 ความสอดคล้องกับสถานะไฟล์ตามความต้องการของ OneDrive จัดในเอกสาร Microsoft ดังนี้7

สถานะไฟล์ตามความต้องการ แอตทริบิวต์ คำสั่งสำหรับตั้ง
พร้อมเสมอ (ปักหมุด) Pinned (แสดง P) attrib +p <path>
พร้อมใช้ในเครื่อง ไม่ใช่ทั้ง P และ U attrib -p <path>
ออนไลน์อย่างเดียว Unpinned (แสดง U) attrib +u <path>

ข้อควรระวังหนึ่ง การสลับสถานะมีลำดับ เมื่ออยากให้ไฟล์ออนไลน์อย่างเดียว (U) เป็น “พร้อมใช้ในเครื่อง” การรัน -p อย่างเดียวทิ้ง U ไว้และเนื้อหาจริงไม่ถูกดึง เอกสาร Microsoft ก็แสดงขั้นตอนทำ +p (พร้อมเสมอ) ก่อนเพื่อดาวน์โหลดเนื้อหาจริง แล้วค่อย -p7 ในสคริปต์ที่ต้องสลับสถานะที่มีอยู่อย่างน่าเชื่อถือ ปลอดภัยกว่าถ้า ล้างแอตทริบิวต์ตรงข้ามพร้อมกัน เช่น attrib +p -u

ลำดับการสลับจากออนไลน์อย่างเดียวเป็นพร้อมใช้ในเครื่องการรัน attrib -p อย่างเดียวบนไฟล์ออนไลน์อย่างเดียวทิ้งแอตทริบิวต์ U และเนื้อหาจริงไม่ถูกดึง ต้องมีขั้นตอนดาวน์โหลดเนื้อหาจริงด้วย attrib +p ก่อนแล้วค่อย -pattrib -p อย่างเดียวattrib +pattrib -pออนไลน์อย่างเดียว (U)ยังเป็น U เนื้อหาจริงไม่ถูกดึงปักหมุด (ดาวน์โหลดเนื้อหาจริง)พร้อมใช้ในเครื่อง

ภาพ 8: การสลับจากออนไลน์อย่างเดียวต้องมีลำดับดึงเนื้อหาจริงด้วย +p ก่อนแล้วค่อย -p

ตัวอย่างการตัดสินใน PowerShell การดูแอตทริบิวต์อย่างเดียวไม่ทำให้เกิดไฮเดรชัน จึงใช้สำรวจและตรวจเป็นชุดได้อย่างมั่นใจ

function Test-CloudPlaceholder {
    param([Parameter(Mandatory)][string]$Path)

    $value = [int](Get-Item -LiteralPath $Path -Force).Attributes

    [pscustomobject]@{
        Path               = $Path
        Offline            = ($value -band 0x00001000) -ne 0  # FILE_ATTRIBUTE_OFFLINE
        RecallOnDataAccess = ($value -band 0x00400000) -ne 0  # เนื้อหาไม่ทั้งหมดอยู่ในเครื่อง
        Pinned             = ($value -band 0x00080000) -ne 0  # เก็บไว้ในอุปกรณ์นี้เสมอ
        Unpinned           = ($value -band 0x00100000) -ne 0  # ออนไลน์อย่างเดียว
    }
}

# ตรวจ CSV ใต้โฟลเดอร์เอกสารเป็นชุด (เนื้อหาไม่ถูกดาวน์โหลด)
# ถอดพาธด้วย API โฟลเดอร์ที่รู้จัก การฮาร์ดโค้ดชื่อแสดง
# "Documents" อาจกลายเป็นพาธที่ไม่มีอยู่ตามชื่อโฟลเดอร์จริง
# (Documents กับชื่อที่แปลตามภาษา) และการตั้งค่า KFM
Get-ChildItem ([Environment]::GetFolderPath('MyDocuments')) -Recurse -Filter *.csv |
    ForEach-Object { Test-CloudPlaceholder $_.FullName } |
    Where-Object RecallOnDataAccess |
    Format-Table -AutoSize

การแคสต์เป็น [int] เพราะการแจกแจง FileAttributes ของ .NET ไม่ได้นิยามชื่ออย่าง RECALL_ON_DATA_ACCESS การดำเนินการบิตไวส์บนค่าตัวเลขตัดสินได้โดยไม่มีปัญหา

5. กับดักที่แอปธุรกิจเหยียบ

นี่คือหัวข้อหลัก ความโปร่งใสของเพลสโฮลเดอร์สะดวกเกือบตลอด แต่รวมกับรูปแบบการประมวลผลแบบฉบับของแอปธุรกิจแล้วปรากฏเป็นหกรูปแบบต่อไปนี้

5.1. การเปิดเริ่มดาวน์โหลดอัตโนมัติ — “เปิดไม่ได้” เมื่อออฟไลน์

การเปิดไฟล์ออนไลน์อย่างเดียวเริ่มไฮเดรชันทันที ออนไลน์ กับไฟล์เล็ก เร็วจนไม่ทันสังเกต แต่ เมื่อ OneDrive หยุด ออกจากระบบ หรือพัก เมื่อเครือข่ายไม่ดี หรือเมื่อไฟล์ใหญ่ จะกลายเป็น “ไฟล์ที่มีอยู่แต่เปิดไม่ได้” ข้อผิดพลาดอาจกลับมาเป็นรหัสตระกูลไฟล์คลาวด์อย่าง ERROR_CLOUD_FILE_PROVIDER_NOT_RUNNING (0x8007016A, “The cloud file provider is not running”) หรือสังเกตเป็นหมดเวลาฝั่งแอป8

กับดักต่อมาคือการตรวจว่ามีอยู่เทียบเท่า File.Exists() และการดึงแอตทริบิวต์หรือขนาด สำเร็จ คุณได้รูปแบบข้อผิดพลาดที่สัญชาตญาณดิสก์ในเครื่องอธิบายไม่ได้: “ตรวจว่ามีอยู่ผ่าน แต่การอ่านล้มเหลว”

กิ่งเมื่อเข้าถึงไฟล์ออนไลน์อย่างเดียวการตรวจว่ามีอยู่และการดึงแอตทริบิวต์กับขนาดสำเร็จ แต่การอ่านเนื้อหาเริ่มไฮเดรชัน หาก OneDrive ทำงานและเครือข่ายดีจะอ่านได้หลังดาวน์โหลด มิฉะนั้นล้มเหลวด้วยข้อผิดพลาดอย่าง 0x8007016A หรือหมดเวลาใช่ไม่ตรวจว่ามีอยู่ หรือดึงแอตทริบิวต์หรือขนาดสำเร็จอ่านเนื้อหาไฮเดรชันเริ่มOneDrive ทำงานและเครือข่ายดี?อ่านได้หลังดาวน์โหลดข้อผิดพลาดอย่าง 0x8007016A หรือหมดเวลา

ภาพ 9: การตรวจว่ามีอยู่อาจสำเร็จในขณะที่การอ่านล้มเหลว สำเร็จหรือล้มเหลวขึ้นกับว่า OneDrive ทำงานหรือไม่และกับเครือข่าย

5.2. กระบวนการแบตช์ชักนำการดาวน์โหลดทุกไฟล์

เล็งแบตช์ที่อ่านทุกไฟล์ในโฟลเดอร์ การคำนวณแฮช การค้นหาข้อความเต็ม หรือการสำรองทำเอง ไปที่ต้นไม้ใต้ OneDrive แล้ว ไฮเดรชันของทุกไฟล์ที่คุณแตะจะถูกชักนำ สำหรับโฟลเดอร์หลาย GB กระบวนการช้าผิดปกติ การดาวน์โหลดก็เติมดิสก์ และบนพีซีความจุต่ำ การขาดพื้นที่ว่างชวนความล้มเหลวอื่น ความจุที่ไฟล์ตามความต้องการควรประหยัดหายไปในการสแกนเต็มครั้งเดียว

นอกจากนี้ หากแอปก่อไฮเดรชันโดยไม่มีกิริยาของผู้ใช้ที่ชัดเจน Windows อาจแสดงโทสต์และให้ผู้ใช้เลือกบล็อก เมื่อถูกบล็อกแล้ว แอปนั้นดาวน์โหลดล้มเหลวต่อไป (ยกได้ด้วย “การดาวน์โหลดไฟล์อัตโนมัติ” ในการตั้งค่า) นั่นเป็นสาเหตุหนึ่งของ “การนำเข้าล้มเหลวเฉพาะบนพีซีเครื่องหนึ่ง”4

แบตช์ชักนำการดาวน์โหลดทุกไฟล์อย่างไรแบตช์ใต้ OneDrive ชักนำไฮเดรชันทุกไฟล์ที่แตะ ก่อความล่าช้าในการประมวลผลและความกดดันดิสก์ และหากผู้ใช้บล็อกบนโทสต์ การดาวน์โหลดล้มเหลวต่อไปใช่ไม่แบตช์ใต้ OneDriveไฮเดรตทุกไฟล์ที่แตะความล่าช้าและความกดดันดิสก์โทสต์อาจปรากฏผู้ใช้บล็อกหรือไม่?ดาวน์โหลดล้มเหลวต่อไปดาวน์โหลดต่อ

ภาพ 10: แบตช์ชักนำไฮเดรชันทุกไฟล์ และหากถูกบล็อกบนโทสต์ ความล้มเหลวจะต่อเนื่อง

5.3. พฤติกรรมผิดของโค้ดที่ไม่คาดแอตทริบิวต์เหล่านี้

โค้ดที่ไม่รู้จัก FILE_ATTRIBUTE_OFFLINE หรือ RECALL_ON_DATA_ACCESS ประพฤติผิดในที่ที่ไม่คาด

  • แอตทริบิวต์ถูกทดสอบความเท่ากันแบบแม่นยำ (attributes == FileAttributes.Archive และคล้ายกัน) จึงตัดเพลสโฮลเดอร์ออกหรือถือเป็นข้อผิดพลาดในฐานะ “ไฟล์ที่ไม่คาด”
  • การตัดสินยกเว้นในเครื่องมือสำรองหรือซิงค์ตีความแอตทริบิวต์ OFFLINE ว่า “ส่งไปเทปแล้ว” แล้วข้าม (หรือกลับกัน ดึงทุกไฟล์ที่ควรยกเว้น)
  • การตรวจอ่านอย่างเดียวหรือการดำเนินการบิตเก็บถาวรทำลายชุดแอตทริบิวต์
รูปแบบพฤติกรรมผิดของโค้ดที่ไม่คาดแอตทริบิวต์โค้ดที่ไม่รู้จักแอตทริบิวต์เพลสโฮลเดอร์ประพฤติผิดเป็นการตัดออกหรือจัดการข้อผิดพลาดจากการทดสอบเท่ากันแม่นยำ การข้ามหรือดึงเต็มจากการตีความ OFFLINE ผิด หรือทำลายชุดแอตทริบิวต์โค้ดที่ไม่คาดแอตทริบิวต์ทดสอบเท่ากันแม่นยำตีความ OFFLINE ผิดการดำเนินการแอตทริบิวต์ทำลายชุดถูกตัดหรือผิดพลาดในฐานะไม่คาดข้าม หรือดึงเต็ม

ภาพ 11: โค้ดที่ไม่รู้จัก OFFLINE หรือแอตทริบิวต์ตระกูล RECALL ประพฤติผิดเป็นการตัดออก การข้ามผิด หรือการทำลายแอตทริบิวต์

คำแนะนำของ Microsoft สำหรับนักพัฒนามินิฟิลเตอร์บอกชัดว่าไม่ควรส่งการอ่านหรือเขียนที่ประมาทไปยังไฟล์ที่มี RECALL_ON_DATA_ACCESS เอกสารมุ่งไดรเวอร์เคอร์เนล แต่หลักที่ว่า “แตะเนื้อหาของไฟล์ที่มีแอตทริบิวต์นี้ = เกิดต้นทุนการดึง” ใช้กับแอปโหมดผู้ใช้ได้ตามเดิม10

5.4. ปฏิสัมพันธ์ระหว่าง FileSystemWatcher กับการซิงค์

เฝ้าดูโฟลเดอร์ใต้ OneDrive ด้วย FileSystemWatcher คุณได้ไม่เพียงกิริยาของผู้ใช้ แต่ยังได้ เหตุการณ์จำนวนมากจากกิจกรรมของแอปซิงค์ ทุกครั้งที่การเปลี่ยนแปลงบนอุปกรณ์อื่นถูกซิงค์ และทุกครั้งที่ไฮเดรชันหรือดีไฮเดรชันเปลี่ยนแอตทริบิวต์หรือขนาด เหตุการณ์ Changed อาจยิง ยิ่งไปกว่านั้น การออกแบบที่เขียนผลของการเฝ้าดูแล้วนำเข้ากลับไปโฟลเดอร์เดียวกันกลายเป็น “พายุการแจ้งการเปลี่ยนแปลง” ในลูปเขียน → อัปโหลด → อัปเดตแอตทริบิวต์ → เหตุการณ์อีก การคัดเหตุการณ์และการออกแบบตรวจเนื้อหาจริงอยู่ใน “A Practical Guide to FileSystemWatcher” แต่ใต้ OneDrive ความจำเป็นสูงขึ้นอีกขั้น

ลูปการแจ้งการเปลี่ยนแปลงจากการเฝ้าดูและเขียนกลับหากแอปเฝ้าดูที่ได้รับเหตุการณ์การเปลี่ยนแปลงเขียนผลการนำเข้ากลับไปโฟลเดอร์เดียวกัน การอัปโหลดและการอัปเดตแอตทริบิวต์ของแอปซิงค์ยิงเหตุการณ์อีก และกลายเป็นลูป คือพายุการแจ้งเหตุการณ์การเปลี่ยนแปลงแอปเฝ้าดูนำเข้าเขียนกลับไปโฟลเดอร์เดียวกันแอปซิงค์อัปโหลดแอตทริบิวต์หรือขนาดถูกอัปเดตซิงค์การเปลี่ยนแปลงจากอุปกรณ์อื่น

ภาพ 12: การเขียนผลการนำเข้ากลับไปโฟลเดอร์เดียวกันกลายเป็นลูปที่กิจกรรมของแอปซิงค์สร้างเหตุการณ์อีก

5.5. ความขัดแย้งของการซิงค์ระหว่างล็อกเฉพาะ และไฟล์ “สำเนา”

ขณะที่แอปธุรกิจเปิดไฟล์ด้วยล็อกเฉพาะ แอปซิงค์อัปโหลดหรืออัปเดตไฟล์นั้นไม่ได้ การวางแอปที่ถือล็อกนาน (Access .accdb ไฟล์ข้อมูลรูปแบบทำเอง ไฟล์บันทึก และคล้ายกัน) ใต้ OneDrive ทำให้ข้อผิดพลาดการซิงค์เป็นสถานะปกติ ในทางกลับกัน เมื่อไฟล์เดียวกันถูกแก้ไขบนหลายพีซี แอปซิงค์พยายามเก็บทั้งสองฉบับและสร้างไฟล์ซ้ำที่มีชื่อพีซี หรือสำเนาขัดแย้งอย่าง “— สำเนา” การนำเข้าที่สมมติ “หนึ่งโฟลเดอร์ หนึ่งไฟล์” ประพฤติผิดบนสำเนานี้ พื้นฐานการออกแบบล็อกดู “Mutual Exclusion Fundamentals for File-Based Integration

ปัญหาซิงค์จากล็อกเฉพาะและการแก้ไขหลายพีซีขณะที่แอปเปิดไฟล์ด้วยล็อกเฉพาะ แอปซิงค์อัปเดตไม่ได้และข้อผิดพลาดซิงค์กลายเป็นสถานะปกติ การแก้ไขไฟล์เดียวกันบนหลายพีซีสร้างสำเนาขัดแย้ง และข้อสมมติหนึ่งโฟลเดอร์หนึ่งไฟล์พังแอปเปิดด้วยล็อกเฉพาะซิงค์ไม่ได้ ข้อผิดพลาดกลายเป็นปกติไฟล์เดียวกันถูกแก้ไขบนหลายพีซีสำเนาขัดแย้งถูกสร้างสำเนาซ้ำที่มีชื่อพีซีหรือสำเนาข้อสมมติหนึ่งโฟลเดอร์หนึ่งไฟล์พัง

ภาพ 13: ล็อกเฉพาะทำให้ข้อผิดพลาดซิงค์เป็นสถานะปกติ และการแก้ไขบนหลายพีซีชวนพฤติกรรมผิดจากสำเนาขัดแย้ง

5.6. แอนติไวรัสและตัวทำดัชนีค้นหาชักนำไฮเดรชัน

ไม่ใช่แค่แอปธุรกิจที่อ่านเนื้อหาไฟล์ การสแกนเต็มของซอฟต์แวร์แอนติไวรัส และตัวทำดัชนีค้นหา ก็ชักนำไฮเดรชันหากแตะเนื้อหาของเพลสโฮลเดอร์ Microsoft Defender และผลิตภัณฑ์คล้ายกันข้ามไฟล์ที่มีแอตทริบิวต์ RECALL_ON_DATA_ACCESS ตอนสแกนตามความต้องการ แต่เป็นการตอบสนองฝั่งผลิตภัณฑ์ และ คุณสมมติไม่ได้ว่าผลิตภัณฑ์ความปลอดภัยทุกตัวจะระมัดระวังเท่ากัน หากเห็นอาการอย่าง “เครือข่ายและดิสก์ตันทุกคืนตอนสแกน” หรือ “ไฟล์ที่ควรเป็นออนไลน์อย่างเดียวกลายเป็นของจริงหมดตอนเช้า” ให้สงสัยสายนี้14

ไฮเดรชันที่ถูกชักนำโดยผลิตภัณฑ์ความปลอดภัยหรือตัวทำดัชนีค้นหาเมื่อการสแกนเต็มหรือตัวทำดัชนีค้นหาแตะเนื้อหาเพลสโฮลเดอร์ ผลิตภัณฑ์ที่เคารพแอตทริบิวต์ RECALL จะข้าม แต่ผลิตภัณฑ์ที่ไม่เคารพจะไฮเดรตทุกไฟล์และก่อความกดดันแบนด์วิดท์กลางคืนหรือการกลายเป็นของจริงตอนเช้าผลิตภัณฑ์ที่เคารพผลิตภัณฑ์ที่ไม่เคารพการสแกนเต็มหรือตัวทำดัชนีค้นหาเคารพแอตทริบิวต์ RECALL?ข้ามเพลสโฮลเดอร์แตะเนื้อหาและไฮเดรตแบนด์วิดท์และดิสก์ตันตอนกลางคืนถึงเช้าไฟล์กลายเป็นของจริงหมด

ภาพ 14: การสแกนที่ไม่เคารพแอตทริบิวต์ชักนำไฮเดรชันทุกไฟล์ และปรากฏเป็นโหลดกลางคืนหรือการกลายเป็นของจริงตอนเช้า

6. การตอบสนองฝ่ายพัฒนาแอป — เคารพเพลสโฮลเดอร์

นโยบายพื้นฐานในฐานะนักพัฒนาคือปฏิบัติต่อเพลสโฮลเดอร์ ไม่ใช่เป็น “ไฟล์เสีย” แต่เป็น “ไฟล์ที่มีต้นทุนการดึง”

  • ตัดสินจากแอตทริบิวต์ตอนแจกแจง และอย่าเปิดมั่ว ในการสแกนโฟลเดอร์ ให้ยืนยันจากแอตทริบิวต์ก่อน (การตัดสินบทที่ 4) ว่าเป็นออนไลน์อย่างเดียวหรือไม่ และเปิดเฉพาะไฟล์ที่ต้องการเนื้อหา ให้การประมวลผลที่ “ไม่ตายหากขาด” — เก็บบันทึก คำนวณแฮช สร้างตัวอย่าง — มีทางเลือกข้ามเพลสโฮลเดอร์
// นิยามค่าที่ FileAttributes ใน .NET ไม่ได้นิยาม เป็นตัวเลข
const FileAttributes RecallOnDataAccess = (FileAttributes)0x00400000;
const FileAttributes RecallOnOpen       = (FileAttributes)0x00040000;

static bool IsCloudPlaceholder(FileAttributes attributes) =>
    (attributes & (RecallOnDataAccess | RecallOnOpen | FileAttributes.Offline)) != 0;

foreach (var file in new DirectoryInfo(watchFolder).EnumerateFiles("*.csv"))
{
    if (IsCloudPlaceholder(file.Attributes))
    {
        log.Warn($"{file.Name} เป็นออนไลน์อย่างเดียว ข้ามครั้งนี้");
        continue;
    }
    Import(file.FullName);
}
เส้นทางตัดสินจากแอตทริบิวต์ตอนแจกแจงแล้วค่อยเปิดในการสแกนโฟลเดอร์ ให้ยืนยันแอตทริบิวต์ตอนแจกแจงก่อน หากเป็นเพลสโฮลเดอร์ให้ข้ามและทิ้งบันทึกเตือน และรันการนำเข้าเฉพาะไฟล์อื่น เพื่อหลีกเลี่ยงไฮเดรชันที่ประมาทใช่ไม่ยืนยันแอตทริบิวต์ตอนแจกแจงเพลสโฮลเดอร์?ข้ามและทิ้งบันทึกเตือนรันการนำเข้านโยบายเปิดเฉพาะไฟล์ที่ต้องการเนื้อหา

ภาพ 15: ตัดสินจากแอตทริบิวต์ตอนแจกแจงและข้ามเพลสโฮลเดอร์โดยไม่เปิด เพื่อหลีกเลี่ยงไฮเดรชันที่ประมาท

  • จำไว้ว่า FILE_FLAG_OPEN_NO_RECALL ไม่ใช่การรับประกัน “อย่าดาวน์โหลด” การระบุแฟล็กนี้บน CreateFile อาจแสดงเจตนาว่า “ข้อมูลที่ได้ควรทิ้งไว้ฝั่งระยะไกลและอย่าเขียนกลับที่เก็บในเครื่อง” อย่างไรก็ตามมันเป็นแฟล็กเพียงเพื่อ ไม่ให้ข้อมูลที่ได้ประจำอยู่ในเครื่อง หากคุณอ่านเนื้อหา การถ่ายโอนข้อมูลเองยังเกิด หากอยากเลี่ยงแบนด์วิดท์และความหน่วงเอง ให้จบด้วยแอตทริบิวต์ ขนาด และประทับเวลาอย่างเดียว — อย่าขอสิทธิ์อ่าน (เปิดด้วยสิทธิ์เข้าถึง 0 ใช้เมทาดาทาจากผลการแจกแจง) นั่นปลอดภัยที่สุด9
ผลและขีดจำกัดของ FILE_FLAG_OPEN_NO_RECALLFILE_FLAG_OPEN_NO_RECALL เป็นแฟล็กเพื่อไม่ให้ข้อมูลที่ได้ประจำอยู่ในเครื่อง หากอ่านเนื้อหา การถ่ายโอนข้อมูลเองยังเกิด จึงถ้าอยากเลี่ยงการถ่ายโอน สิ่งที่ปลอดภัยที่สุดคือจบด้วยเมทาดาทาอย่างแอตทริบิวต์เปิดด้วยแฟล็ก NO_RECALLอ่านเนื้อหาเกิดการถ่ายโอนข้อมูลไม่ประจำอยู่ในเครื่องจบด้วยเมทาดาทาอย่างเดียวไม่มีการถ่ายโอน ปลอดภัยที่สุด

ภาพ 16: FILE_FLAG_OPEN_NO_RECALL กันแค่ไม่ให้ประจำอยู่ในเครื่อง หากอยากเลี่ยงการถ่ายโอนเอง ให้จบด้วยเมทาดาทาอย่างเดียว

  • ใส่ “นี่อยู่ใต้ OneDrive” ในข้อความข้อผิดพลาด เมื่ออ่านล้มเหลว แค่ยืนยันว่าพาธเป้าหมายอยู่ใต้ %OneDrive% และใส่ในข้อความก็ลดเวลาคัดกรองของหน้างานและแผนกช่วยเหลือมาก หากตรวจพบข้อผิดพลาดตระกูลไฟล์คลาวด์อย่าง 0x8007016A อุดมคติคือบอกผู้ใช้ “โปรดตรวจสถานะของ OneDrive”
  • อย่าวางโฟลเดอร์ข้อมูลของแอปใต้ OneDrive ในสภาพแวดล้อม KFM “เอกสาร” ก็อยู่ใต้ OneDrive วางการตั้งค่า ฐานข้อมูล และไฟล์ทำงานของแอปใน %ProgramData% หรือ %LocalAppData% และ อย่าเลือกเดสก์ท็อปหรือเอกสารเป็นตำแหน่งบันทึกเริ่มต้นหรือโฟลเดอร์นำเข้าเริ่มต้น วิธีตัดสินว่าใส่อะไรที่ไหนสรุปใน “How to Choose Where a Windows App Stores Local Data
  • ตัดสินพฤติกรรมเมื่อผู้ใช้เลือกตำแหน่งใต้ OneDrive สำหรับแอปที่ให้ผู้ใช้เลือกตำแหน่งบันทึก ให้ใส่การตัดสินใจออกแบบในสเปกล่วงหน้า เช่น เตือนเมื่อพาธที่เลือกอยู่ใต้ OneDrive (ใต้พาธของตัวแปรสภาพแวดล้อม OneDrive / OneDriveCommercial) หรือปฏิเสธเฉพาะการวางไฟล์ล็อกหรือฐานข้อมูล

7. การตอบสนองฝ่ายไอที — ควบคุมด้วยพินและนโยบาย

จากตำแหน่งไอที การปฏิบัติการที่เป็นจริงไม่ใช่ “ปิดไฟล์ตามความต้องการทั้งก้อน” แต่คือ รับประกันเนื้อหาจริงเฉพาะที่ธุรกิจต้องการ

  • ปักหมุดโฟลเดอร์ที่แอปธุรกิจอ่าน เลือก “เก็บไว้ในอุปกรณ์นี้เสมอ” จากเมนูคลิกขวาของ Explorer หรือรัน attrib +p -u <folder> /s /d จากสคริปต์สร้างอิมเมจ (ระบุ -u พร้อมกันเพื่อให้ส่วนผสมของไฟล์ที่ออนไลน์อย่างเดียวแล้วถูกสลับเป็นปักหมุดอย่างน่าเชื่อถือ) ไฟล์ที่ปักหมุดมีเนื้อหาจริงรับประกันในเครื่อง และอยู่นอกการแปลงอัตโนมัติเป็นออนไลน์อย่างเดียวที่จะพูดทีหลัง72
  • ตั้งค่า KFM และไฟล์ตามความต้องการ “โดยเจตนา” ไม่ใช่ “เปิดอยู่เมื่อเราสังเกต” นโยบายหลัก (นโยบายกลุ่ม / Intune) มีดังนี้111
จุดประสงค์ นโยบาย (ค่ารีจิสทรี) ผล
ควบคุมไฟล์ตามความต้องการ Use OneDrive Files On-Demand (FilesOnDemandEnabled) เปิด: ผู้ใช้ใหม่เริ่มต้นเป็นออนไลน์อย่างเดียว ปิด: ซิงค์เต็มแบบคลาสสิก
บังคับ KFM เป็นชุด Silently move Windows known folders to OneDrive (KFMSilentOptIn) ย้ายเดสก์ท็อปและคล้ายกันโดยไม่มีการกระทำของผู้ใช้
ห้าม KFM Prevent users from moving their Windows known folders to OneDrive (KFMBlockOptIn) ห้ามย้ายโฟลเดอร์ที่รู้จัก
ห้ามปิด KFM Prevent users from redirecting their Windows known folders to their PC (KFMBlockOptOut) ห้ามผู้ใช้ปิด
ลดความจุไซต์ทีม Convert synced team site files to online-only (DehydrateSyncedTeamSites) ทำให้ไซต์ทีมที่ซิงค์แล้วเป็นออนไลน์อย่างเดียว (จำไว้ว่าทำงานในทิศที่เนื้อหาจริงหาย)
  • รู้ว่า Storage Sense เคลื่อนอย่างไร Storage Sense มีฟีเจอร์ที่ คืนไฟล์คลาวด์ที่ไม่ได้เปิดเป็นจำนวนวันเป็นออนไลน์อย่างเดียวอัตโนมัติ และตั้งจำนวนวันด้วยนโยบายได้ (ConfigStorageSenseCloudContentDehydrationThreshold) ค่าเริ่มต้นคือ 0 (ไม่คืนอัตโนมัติ) แต่หากผู้ใช้เปิดจากหน้าจอการตั้งค่า หรือองค์กรตั้งสำหรับอุปกรณ์ความจุต่ำ “ไฟล์ที่เปิดสัปดาห์ที่แล้วกลับเป็นไอคอนเมฆ” เกิดเป็นพฤติกรรมปกติ ไฟล์ที่ปักหมุดอยู่นอกขอบเขต จึง “ปักหมุดโฟลเดอร์ธุรกิจ” ใช้ได้ที่นี่ด้วย122
กิ่งการแปลงอัตโนมัติเป็นออนไลน์อย่างเดียวของ Storage Senseในการปล่อยอัตโนมัติของ Storage Sense ไฟล์ที่ปักหมุดอยู่นอกขอบเขตและเนื้อหาจริงถูกเก็บ ไฟล์ที่ไม่ได้ปักหมุดและไม่ได้เปิดเป็นจำนวนวันถูกคืนเป็นออนไลน์อย่างเดียวใช่ไม่ใช่ไม่การปล่อยอัตโนมัติของ Storage Senseปักหมุด?นอกขอบเขต เนื้อหาจริงถูกเก็บไม่ได้เปิดเป็นจำนวนวัน?คืนเป็นออนไลน์อย่างเดียวเนื้อหาจริงถูกเก็บค่าเริ่มต้น 0 ไม่คืนอัตโนมัติ

ภาพ 17: Storage Sense คืนไฟล์ที่ไม่ได้เปิดเป็นจำนวนวันเป็นออนไลน์อย่างเดียว แต่พินอยู่นอกขอบเขต

  • ประมาณผลกระทบก่อนปิดไฟล์ตามความต้องการ การปิด FilesOnDemandEnabled กลายเป็นการซิงค์ดาวน์โหลดเต็มแบบคลาสสิก แต่การใช้ดิสก์และโหลดแบนด์วิดท์ของการซิงค์ครั้งแรกพุ่ง Microsoft แนะนำให้เปิดทิ้งไว้ และควรถือว่าการปิดเป็นมาตรการจำกัดหลังยืนยันว่า “ปริมาณข้อมูลของผู้ใช้เป้าหมายน้อย” และ “มีที่ดิสก์เหลือ”112
  • ใส่ในขั้นตอนสนับสนุน การใส่ขั้นตอนคัดกรองของบทถัดไปในแม่แบบคำถาม “ไฟล์บนเดสก์ท็อปเปิดไม่ได้” รักษาคุณภาพการตอบแม้คนรับเรื่องเปลี่ยน

8. ขั้นตอนคัดกรอง — เมื่อถูกถามว่า “ไฟล์เปิดไม่ได้”

เมื่อรับการปรึกษา ให้ยืนยันจากบนลงล่าง

# สิ่งที่ต้องยืนยัน วิธี สิ่งที่คุณได้รู้
1 พาธอยู่ใต้ OneDrive หรือไม่? ยืนยันรากซิงค์ด้วย echo %OneDrive% และจับคู่กับพาธเป้าหมาย ยืนยันพาธจริงของ “เดสก์ท็อป” ในแถบที่อยู่ของ Explorer ด้วย ว่า KFM / OneDrive เกี่ยวข้องหรือไม่
2 สถานะของไฟล์ ยืนยัน U (ออนไลน์อย่างเดียว) P (ปักหมุด) และ O ด้วย attrib <path> ดู “ขนาดบนดิสก์” ในคุณสมบัติด้วย ว่าเนื้อหาจริงอยู่ในเครื่อง หรือเป็นเพลสโฮลเดอร์
3 ว่า OneDrive ทำงานหรือไม่ ไอคอนแถบงาน (ลงชื่อเข้า พัก ข้อผิดพลาด) Get-Process OneDrive ว่าไฮเดรชันเป็นไปได้หรือไม่ 0x8007016A โดยทั่วไปคือหยุดหรือตั้งค่าผิด8
4 เครือข่าย พร็อกซีองค์กร แบนด์วิดท์ การเข้าถึงบริการ OneDrive ว่าการดาวน์โหลดเองเป็นไปได้หรือไม่
5 พื้นที่ดิสก์ว่าง พื้นที่ว่างบนวอลุ่มเป้าหมาย ที่ความจุต่ำมีนโยบายที่ OneDrive บล็อกการดาวน์โหลดด้วย ปัจจัยอื่นของความล้มเหลวไฮเดรชัน
6 บันทึกความล้มเหลว จดรหัสข้อผิดพลาดของแอปและเวลาที่เกิด แล้วจับคู่กับการแสดงข้อผิดพลาดของแอปซิงค์ ว่าเป็นปัญหาฝั่งแอปหรือฝั่ง OneDrive

ทางชั่วคราวคือคลิกขวาโฟลเดอร์เป้าหมายแล้วเลือก “เก็บไว้ในอุปกรณ์นี้เสมอ” (หรือ attrib +p /s /d) นั่นจัดเนื้อหาจริงในเครื่องและธุรกิจเดินต่อได้ เหนือนั้น ให้ตัดสินว่าสาเหตุแก่อยู่ฝั่งแอป (บทที่ 6) หรือฝั่งไอที (บทที่ 7) เป็นการตอบถาวร

เส้นทางจากทางชั่วคราวสู่การตอบถาวรเป็นทางชั่วคราว การตั้งโฟลเดอร์เป้าหมายเป็นเก็บไว้ในอุปกรณ์นี้เสมอจัดเนื้อหาจริงในเครื่องให้ธุรกิจเดินต่อได้ เหนือนั้นคุณตัดสินว่าสาเหตุแก่อยู่ฝั่งแอปหรือไอทีแล้วไปสู่การตอบถาวรฝั่งแอปฝั่งไอทีปักหมุดชั่วคราวเนื้อหาจริงถูกจัดในเครื่องธุรกิจเดินต่อสาเหตุแก่อยู่ที่ไหน?ไปการตอบบทที่ 6ไปการตอบบทที่ 7

ภาพ 18: ทางชั่วคราวคือปักหมุด จัดเนื้อหาจริง และให้ธุรกิจเดินต่อ การตอบถาวรเดินต่อหลังตัดสินว่าเป็นฝั่งแอปหรือฝั่งไอที

หากยืนยันมาถึงตรงนี้แล้ว “พาธไม่ได้อยู่ใต้ OneDrive” และ “ก็ไม่ใช่เพลสโฮลเดอร์” ให้ไปสาเหตุประจำอื่นอย่างโฟลเดอร์ใช้ร่วมหรือความยาวพาธ “Pitfalls of Network Drives and UNC Paths” และ “MAX_PATH and Windows Path/Filename Pitfalls” คือแผนที่สำหรับขั้นต่อไป

9. สรุป

  • KFM อาจย้ายเดสก์ท็อป เอกสาร และรูปภาพจริงไปใต้ C:\Users\<ชื่อ>\OneDrive\ แอปที่สมมติพาธคงที่จะพังตรงนี้ การถอดด้วย API โฟลเดอร์ที่รู้จักคือก้าวแรก
  • ไฟล์ตามความต้องการเปิดเป็นค่าเริ่มต้น และเพลสโฮลเดอร์ที่ไม่มีเนื้อหาในเครื่องมีอยู่เป็นเรื่องปกติ เพลสโฮลเดอร์คือจุดรีพาร์สของ Cloud Files API (cldflt.sys) และการเปิดจะไฮเดรตอัตโนมัติ
  • สถานะตัดสินจากแอตทริบิวต์ไฟล์ (OFFLINE / RECALL_ON_DATA_ACCESS / PINNED / UNPINNED) และปรากฏเป็น O, P และ U ใน attrib การตรวจแอตทริบิวต์อย่างเดียวไม่ทำให้ดาวน์โหลด
  • อุบัติเหตุของแอปธุรกิจปรากฏเป็นความล้มเหลวไฮเดรชันเมื่อออฟไลน์ การดาวน์โหลดเต็มจากแบตช์ โค้ดที่ไม่คาดแอตทริบิวต์ ปฏิสัมพันธ์ระหว่าง FileSystemWatcher กับการซิงค์ ความขัดแย้งระหว่างล็อกเฉพาะกับการซิงค์ และไฮเดรชันที่ถูกชักนำโดยผลิตภัณฑ์ความปลอดภัย
  • ฝั่งแอป พื้นฐานคือ “ตัดสินจากแอตทริบิวต์และอย่าเปิดมั่ว” “อย่าวางโฟลเดอร์ข้อมูลใต้ OneDrive” และ “บอกว่าอยู่ใต้ OneDrive เมื่อแจ้งข้อผิดพลาด”
  • ฝั่งไอที คุณสร้างสถานะที่ตั้งใจด้วย “การปักหมุดโฟลเดอร์ธุรกิจ” และ “การควบคุมด้วยนโยบายของ KFM ไฟล์ตามความต้องการ และ Storage Sense”
  • การคัดกรองเดินได้แบบกลไกตามลำดับ พาธ → attrib → OneDrive ทำงาน → เครือข่าย → พื้นที่ว่าง → บันทึก

ครั้งหน้าเมื่อถูกถามว่า “ไฟล์อยู่ตรงนั้นแต่เปิดไม่ได้” ให้ถามสิ่งนี้ก่อน

ไฟล์นั้นอยู่บนดิสก์ในเครื่องจริงหรือ? หรือมีแค่รูปลักษณ์ของคลาวด์นั่งอยู่ตรงนั้น?

บทความที่เกี่ยวข้อง

ด้านให้คำปรึกษาที่เกี่ยวข้อง

KomuraSoft LLC รับสืบสวนความล้มเหลวของแอปธุรกิจที่เกี่ยวข้องกับ OneDrive และที่เก็บคลาวด์ — “การนำเข้าที่เคยทำงาน หลังเปลี่ยนพีซีไม่ทำงานอีก” “ไฟล์เปิดไม่ได้เฉพาะบนพีซีเครื่องหนึ่ง” — การออกแบบและแก้การประมวลผลไฟล์และการเฝ้าดูที่สมมติเพลสโฮลเดอร์ และการทบทวนการออกแบบตำแหน่งบันทึกในสภาพแวดล้อม KFM / ไฟล์ตามความต้องการ เริ่มจากแยกอาการก็ได้ — ติดต่อได้ตามสบาย

ลิงก์อ้างอิง

  1. Microsoft Learn, Redirect and move Windows known folders to OneDrive. ว่า KFM ย้ายเดสก์ท็อป เอกสาร และรูปภาพไปใต้ OneDrive และนโยบายข้อเสนอ การบังคับเงียบ ห้ามปิด และห้ามย้าย  2 3 4

  2. Microsoft Learn, Recommended sync app configuration. ว่าไฟล์ตามความต้องการเปิดเป็นค่าเริ่มต้นและการเปิดทิ้งไว้ถูกแนะนำ และว่า Storage Sense เก็บกวาด “ไฟล์พร้อมใช้ในเครื่องที่ไม่ได้ปักหมุด”  2 3 4 5

  3. Microsoft Support, Save disk space with OneDrive Files On-Demand for Windows. สามสถานะของไฟล์ตามความต้องการ และการกระทำ “เก็บไว้ในอุปกรณ์นี้เสมอ” กับ “เพิ่มเนื้อที่ว่าง”  2 3

  4. Microsoft Learn, Build a Cloud Sync Engine that Supports Placeholder Files. ภาพรวมของ Cloud Files API ว่าเพลสโฮลเดอร์ถือเมทาดาทาราว 1KB และเปิดแล้วไฮเดรตอัตโนมัติ ว่าจุดรีพาร์สถูกซ่อนจากโพรเซสอื่นนอกเอนจินซิงค์และที่อยู่ใต้ %systemroot% และโทสต์กับการบล็อกสำหรับไฮเดรชันพื้นหลัง  2 3 4 5 6

  5. Microsoft Learn, File Attribute Constants. คำนิยามและค่าของ FILE_ATTRIBUTE_OFFLINE, RECALL_ON_OPEN, RECALL_ON_DATA_ACCESS, PINNED และ UNPINNED  2

  6. Microsoft Learn, attrib. ไวยากรณ์คำสั่ง attrib และแฟล็กแอตทริบิวต์รวม O (ออฟไลน์) P (ปักหมุด) และ U (ถอนพิน)  2

  7. Microsoft Learn, Query and set Files On-Demand states in Windows. การยืนยันสถานะไฟล์ตามความต้องการด้วย attrib และการตั้งด้วย +p, -p และ +u รวมถึงบริการ CldFlt  2 3 4 5

  8. Microsoft Learn, Error 0x8007016a when copying files in OneDrive. ว่าข้อผิดพลาด 0x8007016A “The cloud file provider is not running” เกิดเมื่อ OneDrive ตั้งค่าผิดหรือหยุด และขั้นตอนการแก้  2 3

  9. Microsoft Learn, CreateFileW function (fileapi.h). ว่า FILE_FLAG_OPEN_NO_RECALL เป็นแฟล็กที่ระบุว่า “ข้อมูลที่ขอควรถูกทิ้งไว้ฝั่งระยะไกลและไม่ถ่ายโอนกลับที่เก็บในเครื่อง” (มันไม่กันการได้ข้อมูลเอง) และการดึงแอตทริบิวต์ด้วยการเปิดด้วยสิทธิ์เข้าถึง 0  2

  10. Microsoft Learn, Handling placeholders. ว่าเพลสโฮลเดอร์ควรมี FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS และการอ่านหรือเขียนที่ประมาทไปยังไฟล์ที่มีแอตทริบิวต์นี้ชวนไฮเดรชันที่ไม่จำเป็นหรือข้อมูลเสียหาย  2

  11. Microsoft Learn, IT Admins - Use OneDrive policies to control sync settings. นโยบายสำหรับตั้งค่าแอปซิงค์ OneDrive ด้วย GPO/Intune รวม FilesOnDemandEnabled, KFMSilentOptIn, KFMBlockOptIn, KFMBlockOptOut และ DehydrateSyncedTeamSites  2 3 4

  12. Microsoft Learn, Policy CSP - Storage. ว่า Storage Sense ทำให้ไฟล์คลาวด์ที่ไม่ได้เปิดเป็นจำนวนวันเป็นออนไลน์อย่างเดียวได้ ค่าเริ่มต้น 0 (ไม่คืนอัตโนมัติ) และการตั้ง 0–365 วัน  2 3

  13. Microsoft Support, What do the OneDrive icons mean?. ความหมายของไอคอนสถานะที่แสดงใน Explorer เช่น เมฆและเครื่องหมายถูก 

  14. Microsoft Learn, Plan for an Azure File Sync deployment. ว่าการสแกนแอนติไวรัสอาจก่อการเรียกคืนไฟล์ที่มีแอตทริบิวต์ RECALL_ON_DATA_ACCESS และว่า Microsoft Defender และผลิตภัณฑ์คล้ายกันข้ามไฟล์ที่มีแอตทริบิวต์นี้ตอนสแกนตามความต้องการ 

บทความล่าสุดที่มีแท็กเดียวกัน เพื่อเจาะลึกหัวข้อใกล้เคียง

แอปที่พังเมื่อรีซูมจากสลีป — อีเวนต์พลังงานของ Windows ทำงานอย่างไร และสร้างแอปธุรกิจที่รอดได้อย่างไร

เปิดแล็ปท็อปแล้วการเชื่อมต่อของแอปธุรกิจตาย — สาเหตุคือการออกแบบที่ไม่เคยคิดถึงสลีป บทความนี้ครอบคลุมลำดับการแจ้ง WM_POWERBROADCAST พฤติก...

DllMain และ Loader Lock — เหตุผลจริงที่ถูกบอกให้ "อย่าทำอะไรในการเริ่มต้น DLL"

ทำไมคุณต้องไม่เรียก LoadLibrary หรือซิงโครไนซ์กับเธรดอื่นจาก DllMain บทความนี้อธิบายจากแหล่งปฐมภูมิว่า loader lock ทำให้การแจ้ง DLL ทุกคร...

"ไม่ตอบสนอง" คืออะไรจริง ๆ — Windows ตัดสินว่าแอปแฮงอย่างไร และออกแบบอย่างไรให้ไม่แฮง

"ไม่ตอบสนอง" ของ Windows คือกลไกที่ OS ตัดสินว่าหน้าต่างไม่ได้ดึงข้อความเป็นเวลา 5 วินาทีแล้วแทนที่ด้วยหน้าต่างโกสต์ บทความนี้ครอบคลุมภาย...

Spurious Wakeup — ทำไม condition variable จึงตื่น "โดยไม่ถูกแจ้ง" และวิธีรออย่างถูกต้องบน Windows

การรอของ condition variable สามารถกลับได้แม้ไม่มีการแจ้งมาถึง (spurious wakeup) บทความนี้อธิบายจากการอิมพลีเมนต์ของ Windows ว่าทำไมข้อกำห...

WPR/WPA ในทางปฏิบัติ — บทนำการสอบสวนประสิทธิภาพทั้งระบบเมื่อ "พีซีทั้งเครื่องช้า"

ปัญหาประสิทธิภาพอย่าง "พีซีทั้งเครื่องช้า" หรือ "สตาร์ตช้า" ที่ Task Manager ตามไม่ทัน สอบสวนได้ด้วยการจับและอ่าน ETW เทรซทั้ง OS ด้วย WP...

หน้าเหล่านี้วางหัวข้อไว้ในบริบทที่กว้างขึ้นของบริการและการตัดสินใจ

บทความนี้เกี่ยวข้องโดยตรงกับบริการต่อไปนี้

คำถามที่พบบ่อย

คำถามที่มักพบในการปรึกษาเกี่ยวกับหัวข้อของบทความนี้

แอปธุรกิจบอกว่า "ไม่พบไฟล์" และอ่าน CSV ที่วางบนเดสก์ท็อปไม่ได้ ทำไม?
หลายกรณีโฟลเดอร์เดสก์ท็อปเองถูก Known Folder Move (KFM) ของ OneDrive ย้ายไปใต้ C:\Users\<ชื่อผู้ใช้>\OneDrive\Desktop หรือไฟล์กลายเป็นเพลสโฮลเดอร์ออนไลน์อย่างเดียว แอปที่สมมติพาธคงที่อย่าง C:\Users\<ชื่อผู้ใช้>\Desktop จะหาไฟล์ไม่เจอหลังย้าย แม้พาธถูกต้อง ไฟล์ออนไลน์อย่างเดียวก็เปิดไม่ได้เมื่อ OneDrive หยุดหรือเครือข่ายไม่ดี ก่อนอื่นยืนยันว่าพาธเป้าหมายอยู่ใต้ OneDrive หรือไม่ และตรวจด้วยคำสั่ง attrib ว่ามี U (ออนไลน์อย่างเดียว) หรือไม่ ชั่วคราวคุณตรึงเนื้อหาจริงไว้ในเครื่องด้วย "เก็บไว้ในอุปกรณ์นี้เสมอ" จากเมนูคลิกขวาได้
โปรแกรมบอกได้ไหมว่าไฟล์เป็นออนไลน์อย่างเดียว?
ได้ เพลสโฮลเดอร์ออนไลน์อย่างเดียวมีแอตทริบิวต์อย่าง FILE_ATTRIBUTE_OFFLINE และ FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS (0x00400000) จึงตัดสินสถานะจากแอตทริบิวต์ไฟล์ได้โดยไม่ต้องดาวน์โหลดเนื้อหา การดึงแอตทริบิวต์หรือการแจกแจงโฟลเดอร์ไม่ทำให้เกิดไฮเดรชัน (ดาวน์โหลด) ใน .NET ค่าบางค่าไม่ได้ถูกนิยามบน FileAttributes จึงแคสต์เป็นจำนวนเต็มแล้วตรวจด้วยบิตไวส์ หากต้องเปิดโดยไม่อ่านเนื้อหาจริง ๆ ก็มีวิธีอย่าง FILE_FLAG_OPEN_NO_RECALL ของ CreateFile
ปิดไฟล์ตามความต้องการแล้วปัญหาหายไหม?
ถือว่าการปิดเป็นทางสุดท้าย การปิดจะดาวน์โหลดทุกไฟล์ในขอบเขตซิงค์ลงเครื่อง จึงกินความจุดิสก์และโหลดเครือข่ายของการซิงค์ครั้งแรกมาก และ Microsoft ก็แนะนำให้เปิดทิ้งไว้ ในทางปฏิบัติยืดหยุ่นกว่าถ้าตั้งเฉพาะโฟลเดอร์ที่แอปธุรกิจอ่านเป็น "เก็บไว้ในอุปกรณ์นี้เสมอ" (ปักหมุด) ที่รากฐานกว่า การแก้ที่เชื่อถือได้คือออกแบบใหม่ให้โฟลเดอร์ข้อมูลและโฟลเดอร์นำเข้าของแอปไม่อยู่ใต้การจัดการของ OneDrive
ตั้ง "เก็บไว้ในอุปกรณ์นี้เสมอ" แล้ว แต่บางไฟล์สุดท้ายกลับเป็นไอคอนเมฆ ทำไม?
ก่อนอื่นยืนยันด้วยคำสั่ง attrib ว่าไฟล์มีพินจริง (แอตทริบิวต์ P) ไฟล์ที่ปักหมุดอยู่นอกการแปลงอัตโนมัติเป็นออนไลน์อย่างเดียวของ Storage Sense แต่ไฟล์ที่แค่ "พร้อมใช้ในเครื่อง" เพราะมีคนเปิด โดยไม่ปักหมุด อาจถูกคืนเป็นออนไลน์อย่างเดียวหลังระยะหนึ่งตามการตั้งค่าและนโยบาย Storage Sense การกระทำ "เพิ่มเนื้อที่ว่าง" ของผู้ใช้เอง และนโยบายที่ทำไฟล์ไซต์ทีมเป็นออนไลน์อย่างเดียว (DehydrateSyncedTeamSites) ก็คืนไอคอนเมฆเช่นกัน โฟลเดอร์ที่ธุรกิจต้องอยู่ในเครื่อง ให้ปฏิบัติการด้วยการปักหมุดระดับโฟลเดอร์

โปรไฟล์ผู้เขียน

หน้าแนะนำผู้เขียนบทความ

Go Komura

ผู้แทนของ KomuraSoft LLC

เชี่ยวชาญด้านการพัฒนาซอฟต์แวร์ Windows ที่ปรึกษาเทคนิค และการตรวจสอบบั๊ก โดยเฉพาะโปรเจกต์ที่มีระบบเดิมและบั๊กที่ทำซ้ำได้ยาก

ลิงก์สาธารณะ

กลับไปยังบล็อก