Thứ Ba, 27 tháng 11, 2012

Gọi hàm Javascript bằng webbrowser control C#

Hum nay ngồi làm cái chương trình quét dữ liệu tự động sử dụng webbrowser control.

Do dữ liệu nhiều lên website nó phân trang, sau khi lấy hết dữ liệu của trang hiện tại mình phải tìm đúng cái link để qua trang kế và tự động click vào hoặc lấy url của nó để chuyển đến trang kế.

Ngồi Inspect Element ai ngờ nó sử dụng javascript để qua trang kế ^^. Thay vì phải tìm link này để click vào thì mình dùng webbrowser control gọi trực tiếp hàm javascript này.


Sử dụng webbrowser control để gọi javascript qua trang kế:
  1. private void GoToPage(int page)  
  2. {  
  3.     webBrowser.Document.InvokeScript("gotoPage"new object[] { page });  
  4. }  
Cách làm này đỡ mất công phải tìm đúng thẻ để gọi phương thức click, có thể tăng tự động page thêm 1 sau mỗi trang hoặc nhảy đến 1 trang bất kỳ tùy thích để lấy dữ liệu ^^!.

Xem thêm Điền dữ liệu và tự động click vào button trên website sử dụng webbrowser control c#

Thứ Hai, 19 tháng 11, 2012

Cấu hình thông báo lỗi 404 Directory not found (Không tìm thấy thư mục) cho website trên IIS

Cấu hình thông báo lỗi cho website là điều cần thiết. Trong nhiều trường hợp sẽ che dấu đi lỗi code, version của IIS, .Net Framework,... tránh trường hợp tò mò của những kẻ xấu hoặc hacker lợi dụng các lỗi code hoặc điểm yếu của phiên bản server để khai thác lỗ hổng và phá hoại.

Mình đã có 1 bài viết về cấu hình thông báo lỗi cho website khi truy cập vào 1 file hoặc thư mục không tồn tại trong website.

Tuy nhiên khi mình đưa website lên host (Đã thử trên cả IIS 6 và IIS 7) nó chỉ có tác dụng đối với file .aspx không tồn tại, còn đối với trường hợp người dùng truy cập vào 1 số kiểu file khác hoặc một thư mục không tồn tại thì vẫn bị báo lỗi. Cách khắc phục là cần cấu hình thêm.

Cách 1: Cấu hình trên IIS 7

Trên IIS 6 thì tương tự:

Cách 2: Cấu hình trong web.config IIS7 <system.webServer> </system.webServer>:
(Khi cấu hình trên IIS7 sau đó mở web.config lên sẽ tìm thấy đoạn này)
  1. <httpErrors>  
  2.   <remove statusCode="404" subStatusCode="-1" />  
  3.   <error statusCode="404" prefixLanguageFilePath="" path="http://hanhtranglaptrinh.com" responseMode="Redirect" />  
  4. </httpErrors>  
Chú ý:
Khi test phải publish website lên IIS hoặc hosting. Trường hợp chạy website bằng server ảo do Visual Studio dựng lên kết quả sẽ không chính xác.

Chủ Nhật, 18 tháng 11, 2012

Lấy thông tin dung lượng phân vùng ổ cứng của máy tính bằng C#

Mình có viết 1 cái tool nho nhỏ để check dung lượng ổ cứng của server, mỗi khi dung lượng trống xuống dưới một mức nào đó thì báo động (email,sms ) cho người quản lý vào kiểm tra. Dưới đây là hướng dẫn và demo đơn giản về cách làm:

Add using System.Runtime.InteropServices; và sử dụng DLL Import:
  1. [DllImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceExA")]  
  2. private static extern long GetDiskFreeSpaceEx(  
  3. string lpDirectoryName, out long lpFreeBytesAvailableToCaller,  
  4. out long lpTotalNumberOfBytes, out long lpTotalNumberOfFreeBytes);  
Sử dụng:
  1. long result, total, free, available;  
  2. result = GetDiskFreeSpaceEx("d:"out available, out total, out free);  
  3.   
  4. if (result != 0)  
  5. {  
  6.     long totalGB = total / (1024 * 1024 * 1024);  
  7.     long freeGB = free / (1024 * 1024 * 1024);  
  8.     long availableGB = available / (1024 * 1024 * 1024);  
  9.     string mess = "Tổng số GB: " + totalGB + "\n";  
  10.     mess += "Tổng số GB trống: " + freeGB + "\n";  
  11.     mess += "Tổng số GB trống xài được: " + availableGB;  
  12.     MessageBox.Show(mess);  
  13. }  
Vì kết quả trả về với đơn bị là byte nên mình chuyển qua GB.

Demo:
Sự kiện Form Load khai báo như sau ( dưới đây lấy thông tin của phân vùng D):

Kết quả:

Dưới đây là thông tin Hard Disk Drives máy mình tại thời điểm làm demo này:

Thứ Hai, 12 tháng 11, 2012

Tìm thứ 2 và thứ 7 trong tuần của 1 ngày bất kỳ

Mình cần làm một công việc thống kê dữ liệu trong tuần từ thứ 2 đến thứ 7 nên cần tìm ra ngày thứ 2 và thứ 7 trong tuần của 1 ngày bất kỳ.

Ở đây mình không dám đặt tên hàm là First hay End Of Week vì vấn đề ngày Chủ Nhật có nơi coi là ngày đầu tuần, nhưng có nơi coi là ngày cuối tuần.

Trường hợp này mình xét ngày Chủ Nhật là ngày cuối tuần:
  1. public static DateTime MondayOfWeek(this DateTime date)  
  2. {  
  3.     var dayOfWeek = date.DayOfWeek;  
  4.   
  5.     if (dayOfWeek == DayOfWeek.Sunday)  
  6.     {  
  7.         //xét chủ nhật là đầu tuần thì thứ 2 là ngày kế tiếp nên sẽ tăng 1 ngày  
  8.         //return date.AddDays(1);  
  9.   
  10.         // nếu xét chủ nhật là ngày cuối tuần  
  11.         return date.AddDays(-6);  
  12.     }  
  13.   
  14.     // nếu không phải thứ 2 thì lùi ngày lại cho đến thứ 2  
  15.     int offset = dayOfWeek - DayOfWeek.Monday;  
  16.     return date.AddDays(-offset);  
  17. }  
  18.   
  19. public static DateTime SaturdayOfWeek(this DateTime date)  
  20. {  
  21.     return date.MondayOfWeek().AddDays(5);  
  22. }  

Thứ Tư, 7 tháng 11, 2012

Hàm bỏ dấu tiếng việt trong C#

Bỏ dấu bằng cách replace các ký tự có dấu về ký tự không dấu tương ứng:
  1. public static string RemoveUnicode(string text)  
  2. {  
  3.     string[] arr1 = new string[] { "á""à""ả""ã""ạ""â""ấ""ầ""ẩ""ẫ""ậ""ă""ắ""ằ""ẳ""ẵ""ặ",  
  4.     "đ",  
  5.     "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",  
  6.     "í","ì","ỉ","ĩ","ị",  
  7.     "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",  
  8.     "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",  
  9.     "ý","ỳ","ỷ","ỹ","ỵ",};  
  10.     string[] arr2 = new string[] { "a""a""a""a""a""a""a""a""a""a""a""a""a""a""a""a""a",  
  11.     "d",  
  12.     "e","e","e","e","e","e","e","e","e","e","e",  
  13.     "i","i","i","i","i",  
  14.     "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",  
  15.     "u","u","u","u","u","u","u","u","u","u","u",  
  16.     "y","y","y","y","y",};  
  17.     for (int i = 0; i < arr1.Length; i++)  
  18.     {  
  19.         text = text.Replace(arr1[i], arr2[i]);  
  20.         text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());  
  21.     }  
  22.     return text;  
  23. }  
Viết theo kiểu Extension:
  1. public static string NonUnicode(this string text)  
  2. {  
  3.     string[] arr1 = new string[] { "á""à""ả""ã""ạ""â""ấ""ầ""ẩ""ẫ""ậ""ă""ắ""ằ""ẳ""ẵ""ặ",  
  4.     "đ",  
  5.     "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",  
  6.     "í","ì","ỉ","ĩ","ị",  
  7.     "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",  
  8.     "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",  
  9.     "ý","ỳ","ỷ","ỹ","ỵ",};  
  10.     string[] arr2 = new string[] { "a""a""a""a""a""a""a""a""a""a""a""a""a""a""a""a""a",  
  11.     "d",  
  12.     "e","e","e","e","e","e","e","e","e","e","e",  
  13.     "i","i","i","i","i",  
  14.     "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",  
  15.     "u","u","u","u","u","u","u","u","u","u","u",  
  16.     "y","y","y","y","y",};  
  17.     for (int i = 0; i < arr1.Length; i++)  
  18.     {  
  19.         text = text.Replace(arr1[i], arr2[i]);  
  20.         text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());  
  21.     }  
  22.     return text;  
  23. }  
Test:
  1. string test1 = "hành trang lập trình chấm cơm".NonUnicode();  
  2. string test2 = Functions.RemoveUnicode("hành trang lập trình chấm cơm");  

Thứ Ba, 6 tháng 11, 2012

Cách làm hiệu ứng trượt khi mở Form C# Windows Form

Hôm nay ngồi coi lại cái tool viết hồi hơn 1 năm trước, tình cờ thấy lại đoạn code hồi xưa mình làm hiệu ứng trượt khi mở form con, sẵn tiện share cách làm cho ai có hứng thú.

Kéo vào Form con 1 Time Control sau đó khai báo các biến, hàm tạo và sự kiên Form Load như sau:
  1. private int _parentTop;  
  2. private int _parentLeft;  
  3. private int _parentWidth;  
  4. private int _parentHeight;  
  5.   
  6. public FrConnection(int parentTop, int parentLeft, int parentWidth, int parrentHeight)  
  7. {  
  8.     _parentTop = parentTop;  
  9.     _parentLeft = parentLeft;  
  10.     _parentWidth = parentWidth;  
  11.     _parentHeight = parrentHeight;  
  12.     InitializeComponent();  
  13. }  
  14.   
  15. private void FrConnection_Load(object sender, EventArgs e)  
  16. {  
  17.     Left = _parentLeft - 50;// vị trí khởi tạo của Form  
  18.     Top = ((_parentTop + _parentHeight / 2)) - (Height / 2);  
  19.     timer.Start();  
  20. }  
Ở sự kiện time_Tick khai báo:
  1. private void timer_Tick(object sender, EventArgs e)  
  2. {  
  3.     Left += 50;// tốc độ trượt của Form  
  4.     if (Left >= ((_parentLeft + _parentWidth / 2) - Width / 2))  
  5.     {  
  6.         Left = ((_parentLeft + _parentWidth / 2)) - (Width / 2);  
  7.         Top = ((_parentTop + _parentHeight / 2)) - (Height / 2);  
  8.         timer.Stop();  
  9.     }  
  10. }  
Ở Form cha, khi open Form con sẽ cần truyền các tham số top,left, width, heigh của mình vào Form con:
  1. private void newToolStripMenuItem_Click(object sender, EventArgs e)  
  2. {  
  3.     FrConnection fr = new FrConnection(this.Top, this.Left, this.Width, this.Height);  
  4.     fr.ShowDialog();  
  5. }  
Vị trí của Form con lúc bắt đầu khởi tạo:
 Sau đó Form sẽ trượt ra chính giữa:

Có thể tùy chỉnh quãng đường Form sẽ trượt tại sự kiện Form Load và tốc độ trượt của Form tại sự kiện time_Tick.

Thứ Hai, 5 tháng 11, 2012

Kiểm tra Hệ Điều Hành 64bit bằng C#

Để kiểm tra hệ điều hành đang chạy có phải 64bit hay không, xem thông tin trong class Enviroment.
  1. bool b = Environment.Is64BitOperatingSystem;

Nén và giải nén File trong C# .NET 4.5

Phiên bản .NET Framework 4.5 đã cung cấp thư viện hỗ trợ nén và giải nén file trong NameSpace System.IO.Compression mà các phiên bản .NET Framework trước đó chưa cung cấp.

Trước hết cần đảm bảo .NET 4.5 đã được cài đặt và add reference  System.IO.Compression.FileSystem

  1. //nén thư mục TestZipFile thành TestZipFile.zip  
  2. System.IO.Compression.ZipFile.CreateFromDirectory("C:\\Users\\Phong\\Desktop\\TestZipFile""C:\\Users\\Phong\\Desktop\\TestZipFile.zip");  
  3.   
  4. //giải nén TestZipFile.zip ra thư mục TestExtract  
  5. System.IO.Compression.ZipFile.ExtractToDirectory("C:\\Users\\Phong\\Desktop\\TestZipFile.zip""C:\\Users\\Phong\\Desktop\\TestExtract");  
Xem thêm các tính năng mới trong .NET 4.5 trên MSDN.