เรื่องที่อยากเขียน ... เรื่องที่พยายามเขียน ...
Group Blog
 
All blogs
 
Text File กับ File Transfer

หลายวันก่อน น้องที่ทำงานมาเรียกให้ไปดูปัญหาที่เจอ
บอกว่านั่งงมมาเป็นชั่วโมงแล้ว ปัญหามันมั่วๆ เลยให้ผมช่วยไปดูให้หน่อย
ผมขอให้น้องทำให้ดูโดยเริ่มทำตั้งแต่ต้นใหม่
เค้าก็เริ่มจากใช้โปรแกรม winscp ทำการ copy file ไปที่ server
โดย drag & drop ไปทั้ง directory เลย
ผมบอกให้เค้าเปลี่ยนเป็น copy ทีละ file และให้ระบุด้วยว่า file ไหนเป็น text
ปรากฏว่าปัญหาที่งมมาเป็นชั่วโมงก็หายไป
ผมเลยลองถามน้องคนอื่นด้วยว่า text file คืออะไร ต่างจาก binary file ยังไง
ก็ได้คำตอบประมาณว่า text file คือ file ที่อ่านรู้เรื่อง
ส่วน binary file คือ file ที่อ่านไม่รู้เรื่อง
บางคนบอกดูที่ extension ถ้าเป็น text file จะลงท้ายด้วย .txt .htm .html .log .c .h .cpp .bat

จริงๆแล้ว text file คือ file ที่มีโครงสร้างการจัดเก็บข้อมูล เป็นบรรทัดๆ
โดยแต่ละบรรทัดจะมีตัวปิดบรรทัด (end of line)
และเมื่อจบ file อาจมีตัวปิด file (end of file) ปิดท้ายด้วยก็ได้
ส่วน binary file ก็คือ file ที่ไม่ใช่ text file

end of line กับ end of file ใน text file มันจะไม่เหมือนกันในแต่ละ OS
Unix, Linux, Mac OS X (ซึ่งเป็น Free BSD) ใช้ LF (0x0A) เป็น end of line
DOS, Windows, OS/2, CP/M, Symbian ใช้ CRLF (0x0D+0x0A) เป็น end of line
Apple กับ Mac รุ่นเก่าใช้ CR (0x0D) เป็น end of line
ส่วน end of file เท่าที่ทราบจะมีเฉพาะ DOS โดยใช้ ^Z (0x1A) และจะใส่หรือไม่ใส่ก็ได้

ในเมื่อมีความไม่เหมือนกันในแต่ละ OS เวลาทำ file transfer ก็เลยต้องมีการ convert ให้ถูกต้องในแต่ละ OS ด้วย
โปรแกรมอย่าง winscp มี feature ช่วยจำว่า extension หรือ file pattern ไหนเป็น text file
ทำให้เกิดความสะดวกในการทำงาน กดส่งอย่างเดียวเลย
แต่ก็ไม่แน่เสมอไป ตัวอย่างเช่น .dat อาจเป็น video file ซึ่งเป็น binary file
หรือเป็น file ข้อมูลซึ่งเป็น text file ธรรมดา ขึ้นอยู่ว่าเราเก็บอะไรอยู่

นอกจากเรื่องน้องที่ทำงานแล้ว หลายปีก่อนผมเคยเห็นบริษัทเอกชนขนาดใหญ่รายหนึ่ง
ใช้ software สำหรับช่วยในการติดตั้ง (install) ซึ่งจะทำการ transfer ตัว setup ที่ใช้ในการ install
ออกไปยัง pc ทั่วประเทศ ใช้เวลาหลายวันในการ transfer แต่ละครั้งเพราะต้องทำตอนเลิกงานหรือตอนกลางคืน
software ตัวนี้เขียนขึ้นมาให้ใช้ได้กับหลาย Platform/OS เลยต้องระบุว่า file แต่ละ file เป็น text หรือ binary
แล้วคนทำ file transfer ทำผิดโดยระบุว่า setup.exe เป็น text file เสียเวลา transfer ไปหลายวันค่อยรู้ว่า install ไม่ได้
ต้องมาเริ่ม transfer กันใหม่

อย่าลืม เวลาทำ file transfer ต้องระบุว่าเป็น text หรือ binary ให้ถูกต้องนะครับ




Create Date : 09 สิงหาคม 2551
Last Update : 5 กันยายน 2551 16:35:36 น. 10 comments
Counter : 3113 Pageviews.

 
เหอะ ๆ

มาอ่าน ๆ ๆ ๆ


โดย: พนบ. วันที่: 9 สิงหาคม 2551 เวลา:21:06:03 น.  

 
* ต้อง add blog นี้ไว้ อิอิ สาระๆ

* จะบอกว่า นู๋เรียน com-sci แต่ไหง นู่ม่ายค่อยรู้เลยอ๊ะ เห้อออ


โดย: tida19 วันที่: 10 สิงหาคม 2551 เวลา:0:00:16 น.  

 
ยอดเลยครับ
แนะนำว่าจัดย่อหน้าให้สวยกว่านี้นิดนึง เป็นบล็อกที่มีประโยชน์มาก ๆ เลยครับ


โดย: ศล วันที่: 14 กันยายน 2551 เวลา:11:38:01 น.  

 
ทำไมถึงคิดว่าการระบุว่าไฟล์เป็นชนิด binary หรือ text เป็นการแก้ปัญหา ? ขอถามว่าเวลาที่คุณ download ข้อมูลจากอินเทอร์เน็ต ไม่ว่าจะเป็น source code หรือไฟล์วีดีโอ ผู้ใช้ต้อง "ระบุ" ด้วยหรือว่าไฟล์ที่ต้องการนั้นเป็นชนิดไหน ระหว่าง binary หรือว่า text จึงจะได้ข้อมูลไฟล์ที่ถูกต้อง คงจะวุ่นวายน่าดู แล้วเราจะแน่ใจได้อย่างไรว่า OS ของserver ที่เราโหลดข้อมูลนั้นเป็น windows, linux, AIX, Freebsd, Solaris หรือว่า AS400 EOF ใช้ตัวอักขระใด (อาจไม่ตรงกับwindows หรือ linux ก็เป็นได้)

จริงอยู่ที่ ftp นั้นมีโหมดการโหลดข้อมูล 2 แบบ แต่กรณีถ้าคุณใช้โหมด binary ทั้งหมดก็ไม่น่ามีปัญหา เพราะโหมดนี้รับประกันได้ว่าข้อมูลจะตรงกันทุกไบต์

ปล. 1) นิยามว่า text file คือไฟล์ที่เก็บข้อมูลเป็นบรรทัดนั้นถูกต้องแล้วหรือ ? คำว่า "บรรทัด" หมายถึงอักขระ EOL ใน linux ใช้ 0x0A อย่างนั้นถ้าข้อมูลของไฟล์ใดมี 0x0A ก็ถือว่าเป็น text file ได้สิ แล้วแน่ใจหรือว่าใน binary file ไม่มีอักขระนี้
2) ไฟล์ส่วนใหญ่ที่ใช้กัน (อย่างน้อยก็ระบบไฟล์ของ windows, linux, unix, mac os x, solaris) ไม่มีการใส่ EOF ไว้ใน "เนื้อ" ของไฟล์


โดย: anonymous IP: 125.25.39.60 วันที่: 18 กันยายน 2551 เวลา:15:53:18 น.  

 
ขอบคุณทุกท่านที่มา comment ครับ


ตอบคุณ ศล
เป็น entry ที่สองของผมครับ
กำลังพยายามปรับปรุงอยู่


ตอบคุณ anonymous
การ download file ผ่าน internet ผมเข้าใจว่าเป็น binary นะครับ
ถ้า file ที่ download มาเป็นรูปภาพ เป็นโปรแกรม เป็น compress file ก็ไม่ได้เป็นปัญหาอะไรอยู่แล้ว
แต่บางทีอาจจะเจอ file readme.txt ที่ download มาแล้วเปิดดูใน notepad กลายเป็นมีบรรทัดเดียว ยาวเหยียด
นี่แหละครับ ปัญหาที่จะเจอ เพราะ EOL บน windows ต้องเป็น 0x0D 0x0A แต่ของ unix เป็น 0x0A
notepad เลยเห็นเป็นบรรทัดเดียว

ส่วน binary file ที่มี EOL
แล้วข้อมูลมันเป็น บรรทัด หรือเปล่า
หรือตรงตำแหน่งที่มี 0x0A มันเป็นจุดสิ้นสุดบรรทัด หรือเปล่า
ถ้าใช่ทั้งหมด ก็เป็น text file
ถ้าไม่ใช่ทั้งหมด ก็แสดงว่าข้อมูลไม่อาจจัดให้เป็น บรรทัด ได้
เลยถือว่าเป็น binary file ครับ

ส่วน EOF มันถึงมีหรือไม่มีก็ได้ไงครับ
แต่พึ่งจะเห็น file .h ที่มากับ turbo c มี EOF ติดมาด้วย
ผมไม่ชอบใช้ turbo c เลยไม่เคยสังเกต




โดย: zkaru วันที่: 26 กันยายน 2551 เวลา:22:39:52 น.  

 
text คือเก็บข้อมูลไฟล์ แบบตัวอักขร binary คือ ข้อมูลที่เก็บเป็น ไบต์


โดย: born IP: 222.123.75.60 วันที่: 7 พฤศจิกายน 2551 เวลา:18:40:52 น.  

 
text file มันคืออะไร

และ file of receord คืออะไร


โดย: kraitnapat IP: 125.24.162.15 วันที่: 13 พฤศจิกายน 2551 เวลา:18:39:29 น.  

 
เห็นด้วยกับคุณ zkaru ที่ว่าการโหลดข้อมูลในอินเทอร์เน็ตใช้แบบ
binary เพราะประกันได้ว่าข้อมูลจะตรงกับต้นฉบับทุกไบต์ แต่นั่น
ก็หมายถึงว่าถ้าคุณใช้ ftp ในโหมด binary ก็จะไม่เจอปัญหา
ดังกล่าวด้วยเช่นกัน ผมจึงคาดเดาว่าตัวปัญหาจริงๆ ของกรณีนี้คือ
winscp อาจพยายามใช้โหมด ascii กับบางไฟล์โดยคิดเอาเอง
ว่าไฟล์นั้นเป็น text file

"ตำแหน่งที่มี 0x0A มันเป็นจุดสิ้นสุดบรรทัด หรือเปล่า"
หมายถึงอะไรครับ
ถ้าเรากำลังบอกว่า 0x0A คือ "บรรทัด" แล้วการดูว่ามันอยู่ในจุดสิ้นสุด
บรรทัดหรือไม่ ก็จะกลายเป็นปัญหาไก่กับไข่นะครับ
การจะบอกว่าไฟล์ใดเป็น binary หรือว่า text นั้นไม่จำเป็นต้อง "เห็น" ก็ได้ เราอาจเขียนโปรแกรมเล็กๆ แล้วส่ง "เนื้อ" ของไฟล์ที่
ต้องการทดสอบเข้าไป แล้วให้โปรแกรมแสดงผลลัพธ์ว่าเป็นไฟล์ชนิดใด
แต่แน่นอนว่า algorithm ต้องไม่ใช่ search หา 0x0A แล้วสรุปว่า
เป็นtext file

EOF เป็นส่ิงสมมติที่ OS สร้างขึ้นมาเพื่อสื่อสารกับ Application
ไม่มีทางที่เราจะใส่ EOF ไว้ในเนื้อไฟล์ได้เลย ไม่ว่าจะเป็น Window,
Linux, Mac OS X หรือแม้กระทั่ง DOS


โดย: anonymous IP: 125.27.55.150 วันที่: 12 ธันวาคม 2551 เวลา:13:36:43 น.  

 
การจัดการ file system ใน OS สมัยใหม่ ทำให้ดูเหมือนว่า EOF เป็นสิ่งที่ไม่มีอยู่จริง
แต่สำหรับ text file เพื่อให้ compatible กับระบบเก่า ยังคงมีการตีความ EOF กันอยู่
อย่าง ^Z (0x1A) ใน DOS กับ Windows
ลองดูตัวอย่างจากโปรแกรมที่ผมเขียน

#include
#define MY_TEST_FILE "C:\\\\MyTest.txt"
#define EOF_CHAR 0x1A

int main ()
{
int c;
FILE *fp;

puts ("create file with 2 lines");
fp = fopen (MY_TEST_FILE, "wb");
if (fp == NULL)
{
perror (MY_TEST_FILE);
return -1;
}
fputs ("line 1\\r\\n", fp);
fputs ("line 2\\r\\n", fp);
fclose (fp);
puts ("");

puts ("read as text file");
fp = fopen (MY_TEST_FILE, "r");
if (fp == NULL)
{
perror (MY_TEST_FILE);
return -1;
}
while ((c = getc (fp)) != EOF)
putchar (c);
fclose (fp);
puts ("");

puts ("create file with EOF between 2 lines");
fp = fopen (MY_TEST_FILE, "wb");
if (fp == NULL)
{
perror (MY_TEST_FILE);
return -1;
}
fputs ("line 1\\r\\n", fp);
putc (EOF_CHAR, fp);
fputs ("line 2\\r\\n", fp);
fclose (fp);
puts ("");

puts ("read as text file");
fp = fopen (MY_TEST_FILE, "r");
if (fp == NULL)
{
perror (MY_TEST_FILE);
return -1;
}
while ((c = getc (fp)) != EOF)
putchar (c);
fclose (fp);
puts ("");

puts ("read as binary file");
fp = fopen (MY_TEST_FILE, "rb");
if (fp == NULL)
{
perror (MY_TEST_FILE);
return -1;
}
while ((c = getc (fp)) != EOF)
putchar (c);
fclose (fp);

getchar ();
return 0;
}


โปรแกรมด้านบนจะทำการสร้าง file ขึ้นมาแล้วเขียนข้อมูลลงไปสองบรรทัด
จากนั้นจะอ่าน file แบบ text mode กลับขึ้นมาแสดงผลที่จอ
เพื่อให้เห็นว่าอ่านข้อมูลทั้งสองบรรทัดได้ถูกต้อง
ต่อมาทำการสร้าง file ใหม่ คราวนี้เขียน ^Z (0x1A) ลงไประหว่างบรรทัดทั้งสอง
อ่าน file แบบ text mode กลับขึ้นมา
จะเห็นได้ว่าอ่านได้บรรทัดเดียว เพราะไปเจอ ^Z ซึ่งเป็น EOF เลยหยุด
แต่ถ้าอ่านแบบ binary mode ก็จะอ่านได้หมดรวมถึง ^Z ด้วย
ถ้าเอาโปรแกรมไปรันดูก็จะได้ผลประมาณ

create file with 2 lines

read as text file
line 1
line 2

create file with EOF between 2 lines

read as text file
line 1

read as binary file
line 1
line 2

ลองดูเพิ่มเติมจาก wiki ได้นะครับ
//en.wikipedia.org/wiki/End_of_file



โดย: zkaru วันที่: 16 ธันวาคม 2551 เวลา:14:01:07 น.  

 
โค้ดที่แสดงนั้นไม่ได้เป็นอะไรที่มากไปกว่าจะบอกว่า EOF ของระบบ
DOS และ Windows นั้นถูก defined ด้วยค่า 0x1A แต่ว่าการเขียน
โค้ดในลักษณะนี้ไม่สามารถนำไปใช้งานจริงได้ เช่นถ้าคุณจะ copy ไฟล์
คุณต้องเลือกว่าจะเปิดไฟล์แบบไหนด้วยหรือ แล้วถ้าเป็นการ copy
text file ก็คงจะได้ค่าเฉพาะอักษรที่อยู่ก่อน 0x1A เท่านั้น ซึ่งเป็นเรื่อง
ที่ไม่ถูกต้อง

ใน wiki ที่คุณ zkaru อ้างถึงก็บอกอย่างชัดแจ้งว่า EOF เป็นสิ่งที่ return
โดยฟังก์ชั่น read() เมื่อเจอเงื่อนไขที่เป็น "จุดสิ้นสุด" ของไฟล์ แต่
นั่นไม่ได้เป็นการบอกว่าฟังก์ชั่น read() อ่านเจอตัวอักขระ EOF ในไฟล์
(ซึ่งความจริงมันไม่ได้มีอยู่จริงในเนื้อของไฟล์ใดๆ เลย) นอกจากนั้น
wiki ยังบอกอีกว่า EOF มักนิยามด้วยค่า negative value เช่น -1
เพราะ application จะได้สามารถแยกความแตกต่างได้นั่นเอง

สุดท้ายผมอยากจะบอกอีกครั้งว่า EOF เป็นสิ่งสมมติ ที่อาจนิยามแตกต่างกัน
ในแต่ละระบบปฏิบัติการ แต่ถึงแม้ว่าจะนิยามว่า EOF ของ DOS คือ 0x1A
ก็ไม่ได้หมายความว่า 0x1A ต้องเป็น EOF


โดย: anonymous IP: 125.25.37.70 วันที่: 19 ธันวาคม 2551 เวลา:8:32:08 น.  

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 

zkaru
Location :
กรุงเทพฯ Thailand

[Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 2 คน [?]




เรื่องที่อยากเขียน ... เรื่องที่พยายามเขียน ...
Friends' blogs
[Add zkaru's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.