สอบถามครับ พอจะมีวิธีการ Update โปรแกรมโดยอัตโนมัติไหมครับ โดยใช้การ เช็คเวอร์ชั่น .txt ผมใช้ WinApp
ผมไม่เคยใช้น่ะครับ
แบบนี้หรือปล่าวครับ
http://autoupdaterdotnet.codeplex.com/
Date :
2015-07-21 13:12:25
By :
fonfire
น่าสนมากเลยคับ
Date :
2015-07-21 13:31:25
By :
mr.win
step ที่ว่ามาใช้งานได้เลยครับ
แค่เอามันออกมาเป็นโค๊ดก็ได้แล้วครับ
แต่แนะนำนิดนึงครับ
1. ถ้าเปิดโปรแกรมมาก่อนที่เราจะอัพ ver ใหม่ละครับ
2. ถ้าเครื่องเราเปิดทีหลังเครื่อง user ละครับ
3. บางครั้งการ อัพ ที่เครื่อง user ผิดพลาด user ไม่รู้นึกว่าใช้ตัวใหม่ยุละครับ
ถ้าเป็นระบบแลนที่มีการใช้ database ร่วมกันส่วนมากที่เห็นจะเป็นการแชร์โฟลเดอร์ที่ติดตั้งโปรแปกรมให้ user ใช้งานมากว่า
ยกตัวอย่าง Express หรือโปรแกรมบัญชีต่างๆจะเป็นแบบนี้เกือบหมด
แต่ถ้าไม่ใช้ร่วมกันดูเหมือนว่าไม่จำเป็นต้องอัพโปรแกรมก็ใช้งานได้แล้วครับเพราะ database จะต้องออกแบบให้เป็นแบบนั้นยุแล้วครับ
ทั้งนี้ขึ้นยุกับรูปแบบของ database นั้นๆครับว่าออกแบบมายังไง
ส่วนโปรแกรมที่ผมเขียนยุ มีการใช้ database ร่วมกันแชร์โฟลเดอร์ที่ติดตั้งโปรแปกรมให้ user ใช้งานเราจะไม่ต้องเสียเวลาเดินไปเดินเพื่อแก้ไขแต่ละเครื่องครับถ้ามีปัญหาการติดตั้ง
แต่ถ้าคิดจะลองทำจริงๆแนะอีกว่าให้สร้าง windows services มาคอย ดักจับการอัพ เป็นระยะ ครับ (อิงมาจากโปรแกรม Line IDM ฯลฯ )
Date :
2015-07-21 13:50:26
By :
lamaka.tor
เริ่มไม่ถูกเลยครับ
Date :
2015-07-21 14:17:45
By :
Balll2iFFer
ตอบความคิดเห็นที่ : 4 เขียนโดย : Balll2iFFer เมื่อวันที่ 2015-07-21 14:17:45
รายละเอียดของการตอบ ::
ถ้าใช้เป็น .txt
แนะนำให้ทำเป็นรูปแบบ .ini ครับมีระเบียบกว่าสามารถเก็บ SQL ,connectionstring หรืออะไรที่เราขี้เกียจยัดลงโปรแกรมได้
Code (C#)
namespace TORServices
{
public static class clsINI
{
[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, global::System.Text.StringBuilder lpReturnedString, int nSize, string lpFileName);
[DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName);
public static string ReadValue(string Path, string section, string key)
{
global::System.Text.StringBuilder sb = new global::System.Text.StringBuilder(255);
dynamic i = GetPrivateProfileString(section, key, "", sb, 255, Path);
return sb.ToString();
}
public static void WriteValue(string Path, string section, string key, string value) { WritePrivateProfileString(section, key, value, Path); }
public static string textFileReader(string pathFileName)
{
string line;
StreamReader fs;
try
{
fs = new StreamReader(pathFileName);
line = fs.ReadToEnd();
/* อ่าน Encode จาก String ที่อ่านมาได้จาก text file */
Encoding encodeSource = Encoding.GetEncoding(fs.CurrentEncoding.CodePage);
fs.Close();
//* ............ */
Encoding systemEncode = Encoding.Default;
Encoding targetEncode = encodeSource;
/* สั่ง getbyte array จาก string ที่เราอ่านมา */
byte[] srcData = systemEncode.GetBytes( line );
byte[] dstData;
/* ถ้าเป้น Encode ต่างกัน windows และ text file ให้ Convert byte array ไปเป็น text file encode */
if( targetEncode != systemEncode )
dstData = Encoding.Convert( systemEncode, targetEncode, srcData );
else
dstData = srcData;
/* convert bytearray ไปเป็น string ด้วย text file encode */
return targetEncode.GetString(dstData);
}
catch(Exception ex)
{
throw new IOException("cannot find " + pathFileName,ex);
}
}
public static System.Collections.Generic.List<string> textFileReaderFormline(string pathFileName)
{
System.Collections.Generic.List<string> list = new System.Collections.Generic.List<string>();
System.IO.StreamReader fs;
fs = new System.IO.StreamReader(pathFileName, System.Text.Encoding.GetEncoding(874));
string line;
while ((line = fs.ReadLine()) != null)
{
list.Add(line);
}
return list;
}
}
}
บ้านๆคือดักจับตอน load โปรแกรมขึ้นมาละกันครับ
Code (C#)
private void frmMain_Load(object sender, EventArgs e)
{
if (TORServices.clsINI.ReadValue(@"X:\DATA\Info.txt", "Program", "Ver") != Application.ProductVersion)
{
//.....
}
}
รูปแบบง่ายๆมีแค่นี้ครับ
แต่ตัณหาที่จะเจอต่อไปคือ
อ้าว ลบไฟล์ไม่ได้เพราะเปิดใช้งานอยู่ 5555
ดังนั้นถึงได้แนะนำให้สร้าง windows services แล้วใช้ timer หรืออะไรก็ได้ครับมาดักจับ
พอเจอการเปลี่ยนแปลงก็ kill path โปรแกรมมันซะเลย แล้วค่อย สั่งติดตั้งโปรแกรมใหม่
แต่ปัญหายังไม่จบแค่นั้นครับ
หากเราทำงานเกี่ยวกับ database ค้างไว้ แล้วมัน kill path ตัวโปรแกรมเราละ
ดังนั้นในตัวโปแกรมเองจะต้องมีการตรวจจับว่าถ้าเกิดข้อผิดพลาดระหว่างใช้งาน เช่น เราสั่ง delete insert update ซัก 50000 แล้วมันดันค้างเพราะ kill path เราจะแก้ไขยังไง
แต่ก็ยังเอาใจช่วยครับ แค่บอกปัญหาจะเจอแค่นั้นเอง
Date :
2015-07-21 14:50:48
By :
lamaka.tor
จากที่ผมเคยทำมานะครับ ผมใช้วิธีการเช็คเวอร์ชั่น
เครื่อง server
ลง IIS -> สร้าง web service เพื่อสร้าง WebMethod (เพื่อ update ไฟล์, ตรวจสอบเวอชั่นไฟล์)
เครื่อง Client
สร้าง win app สำหรับอัพเดทโปรแกรม เมื่ออัพเดทเสร็จสิ้น ให้เรียกโปรแกรมของเรา และปิดโปรแกรมอัพเดท
คล้ายๆเกมส์ออนไลน์
Date :
2015-07-23 14:27:28
By :
surawutl
ใช่ครับไฟล์อยู่ที่ server
Date :
2015-07-23 20:52:00
By :
Surawutl
Load balance : Server 02