Counter - Strike Raid Attack V1

Một bản mod của nhóm SKIN COUNTER - STRIKE

CS - AVA ( Alliance of Valiant Arms )

Bản Mod được phát triển bởi AVG4 theo hướng AVA

CSFIRED

CSFIRED một thể loại game bắn súng offline được mod theo hướng CrossFire (Đột kích) với hình ảnh sắc nét, âm thanh sống động tạo cho người chơi cảm giác như mình đang sống trong thế giới ảo

Counter Strike he Magic Athletics CD 1.0.0.2

Game do Trung Quốc làm. Dựa trên nền tảng Compete King.

Counter Strike CE

Game do Trung Quốc làm. Đang rất hot trên Group SKIN COUNTER - STRIKE

Counter-Strike NTN 2014

Counter-Strike NTN là một bản mod của Counter-Strike 1.6 huyền thoại, được mod lại với mục đích cải thiện chất lượng đồ họa và âm thanh cũng như hệ thống vũ khí Counter-Strike 1.6 với đặc điểm nổi bật.

Thursday, June 26, 2014

Thay Đổi Model Vũ Khí (Extended)


Note if this example is in your plugin: If its 80%> of your whole script, I suggest you dont post it as a plugin.

This is a small example on changing weapon models for Counter-Strike. With this example you can change all 3 types of the model: view, player, and world. I have written one with Engine and Fakemeta for people who are not familiar with Fakemeta yet, and one only on fakemeta for L33T coders.

I hope this helps, so people dont need to keep posting about this ;).

Engine and Fakemeta


Code:
#include <amxmodx> 
#include <engine> 
#include <fakemeta> 

new VIEW_MODEL[]        = "models/v_<model name>.mdl" 
new PLAYER_MODEL[]        = "models/p_<model name>.mdl" 
new WORLD_MODEL[]    = "models/w_<model name>.mdl"

new OLDWORLD_MODEL[]    = "models/w_<model name>.mdl" // the world model you want replaced

new PLUGIN_NAME[]    = "Custom Weapon Model" 
new PLUGIN_AUTHOR[]         = "Cheap_Suit" 
new PLUGIN_VERSION[]        = "1.0" 

public plugin_init() 
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)     
    register_event("CurWeapon", "Event_CurWeapon", "be","1=1")
    register_forward(FM_SetModel, "fw_SetModel")
} 

public plugin_precache() 
{    
    precache_model(VIEW_MODEL)     
    precache_model(PLAYER_MODEL) 
    precache_model(WORLD_MODEL)
} 

public Event_CurWeapon(id) 
{     
    // might not work for other mods
    new weaponID = read_data(2) 
        
    // eg, if weapon is not ak then continue
    if(weaponID != CSW_AK47)
        return PLUGIN_CONTINUE
    
    // this set's the view model (what you see when holding the gun)
    entity_set_string(id, EV_SZ_viewmodel, VIEW_MODEL)  
    
    // this set's the player model (what you see when people holding the gun)
    entity_set_string(id, EV_SZ_weaponmodel, PLAYER_MODEL)         
    
    return PLUGIN_CONTINUE 
}

public fw_SetModel(entity, model[])
{
    // check if its a valid entity or else we'll get errors
    if(!is_valid_ent(entity)) 
        return FMRES_IGNORED

    // checks if it's the model we want to change
    if(!equali(model, OLDWORLD_MODEL)) 
        return FMRES_IGNORED

    new className[33]
    entity_get_string(entity, EV_SZ_classname, className, 32)

    //            dropped weapons                      map weapons                       c4 + grenades
    if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
    {
        // set's the world model (what you see on the ground)
        entity_set_model(entity, WORLD_MODEL)
        return FMRES_SUPERCEDE
    }
    return FMRES_IGNORED
}
Only Fakemeta

Code:
public Event_CurWeapon(id) 
{     
    // might not work for other mods
    new weaponID = read_data(2) 
        
    // eg, if weapon is not ak then continue
    if(weaponID != CSW_AK47)
        return PLUGIN_CONTINUE
    
    // this set's the view model (what you see when holding the gun)
    set_pev(id, pev_viewmodel, engfunc(EngFunc_AllocString, VIEW_MODEL))
    
    // this set's the player model (what you see when people holding the gun)
    set_pev(id, pev_weaponmodel, engfunc(EngFunc_AllocString, PLAYER_MODEL))
    
    return PLUGIN_CONTINUE 
}

public fw_SetModel(entity, model[])
{
    // check if its a valid entity or else we get errors
    if(!pev_valid(entity)) 
        return FMRES_IGNORED

    // checks if its the model we want to change
    if(!equali(model, OLDWORLD_MODEL)) 
        return FMRES_IGNORED

    new className[33]
    pev(entity, pev_classname, className, 32)
    
    //            dropped weapons                    map weapons                       c4 + grenades
    if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
    {
        engfunc(EngFunc_SetModel, entity, WORLD_MODEL)
        return FMRES_SUPERCEDE
    }
    return FMRES_IGNORED
}
Note: Using viewmodel2 and weaponmodel2.
For Fakemeta you don't need to allocate the string when using viewmodel2 or weaponmodel2.
Amended above example:

Code:
    // this set's the view model (what you see when holding the gun)
    set_pev(id, pev_viewmodel2, VIEW_MODEL)

    // this set's the player model (what you see when people holding the gun)
    set_pev(id, pev_weaponmodel2, PLAYER_MODEL)

Weapon ID reference

Code:
#define CSW_P228        1
#define CSW_SCOUT        3
#define CSW_HEGRENADE        4
#define CSW_XM1014        5
#define CSW_C4            6
#define CSW_MAC10        7
#define CSW_AUG            8
#define CSW_SMOKEGRENADE    9
#define CSW_ELITE        10
#define CSW_FIVESEVEN        11
#define CSW_UMP45        12
#define CSW_SG550        13
#define CSW_GALI        14
#define CSW_GALIL        14
#define CSW_FAMAS        15
#define CSW_USP            16
#define CSW_GLOCK18        17
#define CSW_AWP            18
#define CSW_MP5NAVY        19
#define CSW_M249        20
#define CSW_M3            21
#define CSW_M4A1        22
#define CSW_TMP            23
#define CSW_G3SG1        24
#define CSW_FLASHBANG        25
#define CSW_DEAGLE        26
#define CSW_SG552        27
#define CSW_AK47        28
#define CSW_KNIFE        29
#define CSW_P90            30

Example of changing the skin of the knife


Code:
#include <amxmodx> 
#include <engine> 
#include <fakemeta> 

new VIEW_MODEL[]    = "models/v_newKnife.mdl" 
new PLAYER_MODEL[]    = "models/p_newKnife.mdl" 
new WORLD_MODEL[]    = "models/w_knife.mdl"

new OLDWORLD_MODEL[]    = "models/w_knife.mdl"

new PLUGIN_NAME[]        = "Custom Knife Model" 
new PLUGIN_AUTHOR[]    = "Cheap_Suit" 
new PLUGIN_VERSION[]     = "1.0" 

public plugin_init() 
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)     
    register_event("CurWeapon", "Event_CurWeapon", "be","1=1")
    register_forward(FM_SetModel, "fw_SetModel")
} 

public plugin_precache() 
{    
    precache_model(VIEW_MODEL)     
    precache_model(PLAYER_MODEL) 
    precache_model(WORLD_MODEL)
} 

public Event_CurWeapon(id) 
{     
    new weaponID = read_data(2) 

    if(weaponID != CSW_KNIFE)
        return PLUGIN_CONTINUE

    set_pev(id, pev_viewmodel2, VIEW_MODEL)
    set_pev(id, pev_weaponmodel2, PLAYER_MODEL)
    
    return PLUGIN_CONTINUE 
}

public fw_SetModel(entity, model[])
{
    if(!is_valid_ent(entity)) 
        return FMRES_IGNORED

    if(!equali(model, OLDWORLD_MODEL)) 
        return FMRES_IGNORED

    new className[33]
    entity_get_string(entity, EV_SZ_classname, className, 32)
    
    if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
    {
        engfunc(EngFunc_SetModel, entity, WORLD_MODEL)
        return FMRES_SUPERCEDE
    }
    return FMRES_IGNORED
}

Một Vài Thông Tin Về pev_body


pev_bodylà một giá trị mà nói với các trò chơi mà submodel cần được nhìn thấy được.

Điều này có thể vô cùng mạnh mẽ với các model player, ngoại trừ không ai dường như đã sử dụng tính năng này để tiềm năng của nó được nêu ra. Như của bây giờ và như xa như tôi biết, CS chỉ sử dụng này để hiển thị bom trên người chơi.

Những gì có thể được thực hiện với giá trị này?Ví dụ, bạn có thể đặt tất cả các model và mũ trên máy chủ của bạn thành một model duy nhất. Điều này có rất nhiều ưu hơn khuyết điểm (bên dưới).

Làm thế nào để bạn thay đổi kết hợp?
Hãy nói rằng bạn có hai nhóm submodel như tôi - model và hats.

ĐÂY KHÔNG PHẢI LÀ CÁCH NÓ HOẠT ĐỘNG.
Model1 - ID: 0
Model2 - ID: 1
Model3 - ID: 2
Hat1 - ID: 3
Hat2 - ID: 4
Hat3 - ID: 5

ĐÂY LÀ CÁCH NÓ HOẠT ĐỘNG
Model1 - ID: 0
Model2 - ID: 1
Model3 - ID: 2
Hat1 - ID: 0
Hat2 - ID: 1
Hat3 - ID: 2

Cho chỉ có hai nhóm, bạn muốn sử dụng để có được số lượng pev_body bạn cần:

Code:
pev_body = hat_id * amount_of_models + model_id

Vì vậy, hãy nói rằng bạn muốn cung cấp cho người chơi Model 2 với Hat 3.
pev_body = 2 * 3 + 1 = 7

Tôi đã không cố gắng làm việc với các nhóm hơn nữa, tôi sẽ báo cáo lại một lần tôi làm.


Những gì có thể được thực hiện với điều này?


Bạn có thể ví dụ như làm một plugin cho tùy biến nhân vật đầy đủ. Tạo ra một mô hình với các bộ phận cơ thể như khuôn mặt, mái tóc, kích thước ngực, vv và cho phép người chơi lựa chọn những gì phù hợp với mình.

Ưu điểm:

- Tất cả các model là trong một tập tin lớn hơn, mang đến cho một "cảm giác" tốt hơn khi tải
- Một cách tuyệt vời để giảm số lượng các tập tin trên máy chủ của bạn precached
- Kích thước tập tin nhỏ hơn rất nhiều so với tất cả các mô hình từng người một với nhau, bởi vì các bản sao (thông tin mô hình, hình động vv) được loại bỏ
- Đối với mũ và như vậy, bạn không cần một plugin của bên thứ 3 để xử lý nó (tạo ra một thực thể mới, đặt nó là nguồn gốc, vv)
- Model + mũ vẫn là một thực thể duy nhất
- Rất nhiều khả năng mới

Nhược Điểm:

- Thêm model hơn sẽ đòi hỏi một tải mới của tập tin hoàn chỉnh
- Không quá dễ dàng để làm việc với
- Trình biên dịch là một khốn
- Các mô hình cuối cùng yêu cầu tất cả các mô hình Counter-Strike đã tồn tại, nếu bạn muốn làm cho nón có sẵn cho các mô hình tiêu chuẩn như là tốt
- Người chơi sẽ không thể nhìn thấy mô hình tùy chỉnh của họ

Vấn đề hiện tại:

- Trình biên dịch vẫn bị treo vì một lý do, sản xuất một mô hình chưa hoàn thành (chia kết cấu)
- Cần phải tìm ra cách để thêm các mô hình chia thành các phần như một submodel. Hiện nay, nó cho biết thêm từng phần như một submodel (xem ví dụ mô hình: nhóm modely ', mô hình con 5 và 6
- Cần phải làm cho các quả bom có thể nhìn thấy, tôi sẽ thêm nó vào một nhóm hoàn toàn mới và xem những gì nó như thế nào.
- Edit: biên dịch rơi khi kích thước tập tin là trên 4 MB. Cố gắng tìm một khoảng cách này (model chia tách)
Nếu bạn biết làm thế nào để giải quyết bất kỳ vấn đề trên, vui lòng cho tôi biết.


Sử dụng plugin này nhỏ với mô hình bao gồm để xem tính năng này là những gì có khả năng

Code:
#include < amxmodx > #include < fakemeta > #include < cstrike >     new const cstModel[ ] = "models/player/testmdl/testmdl.mdl" new const cstModelT[ ] = "models/player/testmdl/testmdlt.mdl" new const cstMdlName[ ] = "testmdl" public plugin_precache( ) {     precache_model( cstModel )     precache_model( cstModelT ) } public plugin_init( ) {     register_clcmd( "pev_body", "_body" )     register_clcmd( "changemdl", "_changemdl" ) } public _body( id ) {     new szArgs[ 4 ]     read_args( szArgs, charsmax( szArgs ) )         remove_quotes( szArgs )     trim( szArgs )         new iPev = str_to_num( szArgs )         set_pev( id, pev_body, iPev )         client_print( id, print_console, "Changing your pev_body value to %d", iPev )         return PLUGIN_HANDLED } public _changemdl( id ) {     cs_set_user_model( id, cstMdlName )     client_print( id, print_console, "Your model was changed to %s. You can now change your pev_body value using console command 'pev_body'.", cstMdlName ) }

Bảng giá trị:

Code:
MODEL NAME   HAT   PEV_BODY

T Model 1   Indian Hat  0
T Model 2   Indian Hat  1 
CT Model 1   Indian Hat  2
Hitman    Indian Hat  3
Banana (eyes)   Indian Hat  4
Banana (rest)   Indian Hat  5
CT Model 2   Indian Hat  6
Assassin   Indian Hat  7

T Model 1   Afro   8
T Model 2   Afro   9 
CT Model 1   Afro   10
Hitman    Afro   11
Banana (eyes)   Afro   12
Banana (rest)   Afro   13
CT Model 2   Afro   14
Assassin   Afro   15

T Model 1   Minecraft  16
T Model 2   Minecraft  17 
CT Model 1   Minecraft  18
Hitman    Minecraft  19
Banana (eyes)   Minecraft  20
Banana (rest)   Minecraft  21
CT Model 2   Minecraft  22
Assassin   Minecraft  23

T Model 1   Fly   24
T Model 2   Fly   25 
CT Model 1   Fly   26
Hitman    Fly   27
Banana (eyes)   Fly   28
Banana (rest)   Fly   29
CT Model 2   Fly   30
Assassin   Fly   31

T Model 1   Wings (broken)  32
T Model 2   Wings (broken)  33 
CT Model 1   Wings (broken)  34
Hitman    Wings (broken)  35
Banana (eyes)   Wings (broken)  36
Banana (rest)   Wings (broken)  37
CT Model 2   Wings (broken)  38
Assassin   Wings (broken)  39
Bạn có thể xem submodels trong HLMV trong "bộ phận cơ thể" tab.

UPDATE

Thanks for reading.

HUGE UPDATE

Được rồi, đây là nhận được thậm chí tốt hơn so với tôi nghĩ rằng nó sẽ.

Ảnh động
Mỗi mô hình có khoảng 120 trình tự. Có gì buồn cười về việc này là một mô hình trung bình có kích cỡ 2.3MB - 2

megabytesđó là những hình ảnh động. Có nghĩa là nếu bạn đang đi để kết hợp 5 mô hình kích thước 2.3MB mỗi, kích thước cuối cùng của bạn sẽ được 2MB cho các hình ảnh động + 5 * 300kB = 3.5MB tổng số.

Bomb and defusal kit
Tôi đã thực hiện những mô hình mới trong của tôi. Chức năng để có được ID pev_body như sau:

Code:
stock get_bodyid( iModelId, iHatId, bool: bBomb, bool: bDefusalKit ) {     new iPevBody = iHatId * g_TotalModels + iModelId         if( bBomb )         iPevBody += ( g_TotalModels * g_TotalHats )             if( bDefusalKit )         iPevBody += ( g_TotalModels * g_TotalHats * 2 )         return iPevBody }
Tôi không chắc chắn về điều này - đã không kiểm tra được chưa.

New model
Các mô hình mới là trong file đính kèm. Có 17 model và 39 mũ - tổng kích thước: 11.15MB. Tôi đã gỡ bỏ các hình ảnh động lá chắn, vì họ vô ích cho tôi. Hai mô hình là bản sao (xấu của tôi), vì tôi quên để đổi tên các kết cấu trong số này, vì vậy họ chỉ thay thế các kết cấu khác.

Limits

Các giới hạn cho các mô hình kết hợp là:
- Tối đa 16MB kích cỡ
- Tên Texture đôi khi cần phải được thay đổi hoặc họ sẽ bị ghi đè bởi các mô hình khác
- Tối đa 40 phụ model cho mỗi nhóm (39 mũ, bởi vì là người đầu tiên có sản phẩm nào)

Lưu ý các HatID đầu tiên không còn 0 (ID 0 là "không có gì", chúng tôi đang thiết HatID 0 cho những người không có bất kỳ mũ)

Wednesday, June 25, 2014

Bài 12: Thao tác với XML trong C#

[Bài 12: Thao tác với XML trong C#]
 XML là gì ?
XML (eXtensible Markup Langue) đóng một vai trò quan trọng trong .NET, đọc và ghi một file xml là những xử lý cơ bản chúng ta cần biết.
XML thường được sử dụng để lưu trữ thông tin chương trình, những thiết lập hay tùy chọn sẵn có của chương trình, chức năng hoàn toàn tương tự ini trong ngôn ngữ Autoit.
 Đọc, tạo, chỉnh sửa và ghi XML file
Để giảm tải thời gian đọc bài, mình sẽ minh họa bằng code mẫu và chú thích cho dễ hiểu 
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Xml;
namespace XML
{
class Program
{
static void Main(string[] args)
{
string contentXML = "<item>" +
"<name>Lang Tu</name>" +
"<name>Phat Bui</name>" +
"<name>IWanna Tam</name>" +
"<name>Duy Anh</name>" +
"</item>"; // Tạo một nội dung XMl
XmlDocument docXML = new XmlDocument(); // Tạo đối tượng XmlDocument
docXML.LoadXml(contentXML); // Load nội dung contentXML
string xpath = "//name"; // Đường dẫn của Node con "name"
XmlNode node = docXML.CreateNode(XmlNodeType.Element, "name", null); // Tạo một node mới bằng phương thức CreateNode
node.InnerText = "Yagami Raito"; // Gán nội dung cho Node con mới tạo
docXML.SelectSingleNode("item").AppendChild(node); // Thêm Node con mới tạo vào Node cha "item"
XmlNode name= docXML.SelectSingleNode(xpath); // Lấy ra Node con "name" đầu tiên.
XmlNodeList nameList = docXML.SelectNodes(xpath); // Lấy ra tất cả các Node con "name" hiện có.
foreach (XmlNode bl in nameList) // Truy xuất tất cả các Node con trong nameList
{
if (bl.InnerText == "Yagami Raito") bl.InnerText = "Yagami"; // Thay đổi nội dung Node con có nội dung là "Yagami Raito" thành "Yagami"
Console.WriteLine(bl.InnerText);
}
XmlTextWriter writer = new XmlTextWriter("data.xml", null); // Tạo đối tượng XmlTextWriter để lưu nội dung XML vào file "data.xml"
writer.Formatting = Formatting.Indented;
docXML.Save(writer); // Lưu nội dung docXML vào file "data.xml"
Console.ReadKey();
Process.Start("notepad.exe", "data.xml"); // Khởi tạo tiến trình để Edit tập tin "data.xml"
}
}
}

Bài 11: Làm việc với tập tin trong C#

[Bài 11: Làm việc với tập tin trong C#]
 Bạn có thể truy cập link dưới đây để tìm hiểu :
http://msdn.microsoft.com/en-us/library/System.IO(v=vs.110).aspx
Đầu tiên bạn nhớ khai báo thêm :
using System.IO;
namespace System.IO là vùng của các thư viện lớp dành cho những dịch vụ liên quan đến xuất nhập dữ liệu dựa trên tập tin.
Bạn cần tạo 1 file mới , di chuyển hoặc xóa một file hiện có .
Việc này có hai lớp thực hiện là File và Fileinfo.
 File và Directory : chỉ chứa các phương thức tĩnh (static) chúng chứa tất cả những phương thức để thao tác với file và thư mục
 Fileinfo và Directoryinfo : chứa các phương thức thể hiện (instance) , chúng chỉ thao tác trên 1 đối tượng cụ thể .
Phương thức thể hiện create của lớp File
if (!File.Exists(@"C:\tam.txt"))
{
Console.Write("file chua ton tai");
File.Create(@"C:\tam.txt");
}
else
Console.Write("trung file");
Kí hiệu @ trong khai báo chuỗi path phía trên là giúp C# hiểu kí tư ‘/’ là một kí hiệu của đường dẫn.
 Phương thức thể hiện create của lớp Fileinfo
Để sử dụng các phương thức cũng như thuộc tính của lớp FileInfo bạn cần khởi tạo đối tượng FileInfo cho nó.
FileInfo <Tên biến> = new FileInfo (string <Đường dẫn>);
FileInfo file = new FileInfo(@"C:\tam.txt");
if (!file.Exists)
{
file.Create();
}
else
Console.WriteLine("da ton tai");
 Sao chép 1 File
Dùng phương thức tĩnh File.Copy.
File.Copy(@"C:\tam.txt", @"C:\ta.txt", true);
Phương thức thể hiển Copyto.
FileInfo file = new FileInfo(@"C:\tam.txt");
file.CopyTo(@"C:\tamm.txt",true);
 Di chuyển 1 File
Dùng phương thức tĩnh Move của lớp File.
File.Move(@"C:\tam.txt", @"D:\tam.txt");
Dùng phương thức thể hiện MoveTo của lớp Fileinfo
FileInfo File = new FileInfo(@"C:\tam.txt");
File.MoveTo(@"D:\tam.txt");
Nếu bạn đang cần 1 cách tạo nhanh chóng hoặc di chuyển , sao chép file… thì nên sử dụng phương thức tĩnh . Nếu bạn đang thực hiện nhiều thao tác trên 1 file,
ví dụ :
bạn tạo lập sau đó di chuyển . thì hãy dùng Fileinfo.
Một vài lưu ý :
+ Nếu thư mục hoặc tập tin không tồn tại sẽ xảy ra lỗi ngoại lệ.
+ Nếu không có đường dẫn nào được cung cấp,File sẽ nằm tại thư mục đang làm việc hiện hành.Nếu user không có quyền ghi vào thư mục đang làm việc (chẳng hạn thư mục Program Files ), sẽ xảy ra lỗi ngoại lệ
 Thao tác các thuộc tính File
Để hiện thị các timestamp của một file,bạn có thể sử dụng hoặc là các phương thức tĩnh của lớp File , hoặc là các phương thức tĩnh của lớp Fileinfo.
Ví dụ về phương thức tĩnh File.
Console.WriteLine(File.GetCreationTime(@"C:\tam.txt"));
// GetCreationTime ngày và giờ tạo thư mục
Console.WriteLine(File.GetLastAccessTime(@"C:\tam.txt"));
// GetLastAccessTime thời gian truy xuất cuối của tập tin
Console.WriteLine(File.GetLastWriteTime(@"C:\tam.txt"));
// GetLastWriteTime thời gian ghi lần cuối của tập tin
Ví dụ phương thức thể hiện Fileinfo
FileInfo file = new FileInfo(@"C:\tam.txt");
Console.WriteLine(file.CreationTime);
// CreationTime ngày và giờ tạo thư mục
Console.WriteLine(file.LastAccessTime);
// LastAccessTime thời gian truy xuất cuối của tập tin
Console.WriteLine(file. LastWriteTime);
// LastWriteTime thời gian ghi lần cuối của tập tin
Chỉnh sửa các timestamp của 1 file , bạn có thể sử dụng hoặc là các phương thức tĩnh của lớp File , hoặc là các phương thức tĩnh của lớp Fileinfo.
Ví dụ về phương thức tĩnh File.
File.SetCreationTime(@"C:\tam.txt", DateTime.Parse(@"6,9,2014"));
// SetCreationTime chỉnh sửa ngày và giờ tạo thư mục
Các phương thức thể hiện cũng tương tự để chỉnh sửa thông tin 1 file.
FileInfo file = new FileInfo(@"C:\tam.txt");
DateTime dt = new DateTime(2014,6,13);
file.CreationTime = dt;
Hiện thị các thuộc của 1 file
FileInfo file = new FileInfo(@"C:\tam.txt");
Console.WriteLine(file.Attributes);
 Lựa chọn phương thức mở một File hay Stream để đọc/ghi
Đọc và viết vào files nói chung rất đơn giản; tuy nhiên , Điều này không phải bắt buộc biết các đối tượng File hoặc FileInfo. Thay vào đó chúng ta phải biết một số lớp trình bày nội dung chung gọi là stream.
Sử dụng các luồng(stream) file để thực hiện nhiều chức năng xử lý file khác nhau.Có 5 kiểu cơ bản về các thao tác luồng file dựng sẵn để các bạn sử dụng
+ FileStream
FileStream được sử dụng đọc và viết dữ liệu vào hoặc từ một file. Để khởi tạo một FileStream, bạn cần 4 phần sau:
file bạn muốn truy xuất .
Mode cho biết bạn muốn mở file như thế nào.
Access cho biết bạn muốn truy xuất file như thế nào – bạn định đọc hoặc viết file
share access khả năng truy xuất file.
FileMode Append, Create, CreateNew, Open, OpenOrCreate, or Truncate
FileAccess Read, ReadWrite, or Write
FileShare Inheritable, None, Read, ReadWrite, or Write
Để khởi tạo một stream ta dùng cách sau
FileStream file = new FileStream(@"C:\tam.txt",FileMode.Open,FileAccess.ReadWrite);
+ StreamWriter
Lớp này chứa các phương thức để chỉ ghi các kí tự hoặc dòng các ký tự.
Các phương thức :
Close Đóng stream đang đọc dữ liệu.
Peek Trả về ký tự kế tiếp trong stream mà không di chuyển cho trỏ dữ liệu.
Read Đọc một nhóm ký tự kế tiếp trong Stream.
ReadBlock Đọc một khối kí tự kế tiếp trong Stream.
ReadLine Đọc một dòng kế tiếp trong Stream.
ReadToEnd Đọc hết các kí tự trong Stream.
ví dụ :
FileStream file = new FileStream(@"C:\tam.txt", FileMode.Open);
StreamReader read = new StreamReader(file);
Console.WriteLine(read.ReadToEnd());
read.Close();
+ StreamWriter
Lớp này chứa các phương thức để chỉ ghi các kí tự hoặc các dòng ký tự.
Các phương thức :
Close Đóng stream đang ghi dữ liệu
Write Ghi dữ liệu vào stream
WriteLine Ghi dữ liệu vào stream và ngắt xuống dòng mới
FileStream file = new FileStream(@"C:\tam.txt",FileMode.Open);
StreamWriter write = new StreamWriter(file);
write.Write("767667");
write.Close();

Bài 10: Thao tác với chuỗi trong C#

[Bài 10: Thao tác với chuỗi trong C#]
 Thao tác với chuỗi là công việc thường ngày của hầu hết các lập trình viên C#. .NET Framework mang lại cho chúng ta nhiều công cụ hữu ích để thao tác với chuỗi
Điều đầu tiên cần lưu ý là chuỗi trong .NET là kiểu tham chiếu (reference type). Các kiểu tham chiếu sẽ được quản lý ở bộ nhớ heap trong .NET và chúng được quản lý bởi bộ thu gom rác của .NET (.NET Garbage Collector) và không phải như các kiểu giá trị (value type), chúng không được tự động hủy khi chúng không còn nằm trong phạm vi sử dụng.
Khai báo một chuỗi :
Cú pháp: string ten_bien;
Lưu ý rằng các biến kiểu string không có giá trị mặt định, do đó bạn cần phải quy định giá trị cho nó trước khi truy xuất hoặc sử dụng nó
Ví dụ :
string s = "Yagami Raito";
Console.WriteLine(s)
 Các ký tự Escape
Tương tự với ngôn ngữ C, các chuỗi C# có thể chứa các ký tự escape, các ký tự này sẽ định nghĩa cách chuỗi được in ra.
Các kỹ tự escape được bắt đầu bởi ‘\’ và theo sau là một ký tự
Dưới đây là một số ký tự escape thông dụng:
\’ Thêm vào một dấu nháy đơn
\” Thêm vào một dấu nháy kép
\\ Thêm vào ký tự xuyệt (‘\’)
\a Kích hoạt một cảnh báo hệ thống
\n Thêm một dòng mới
\r Chuyển qua đoạn văn mới
\t Thêm một tab
Ví dụ:
string s = "I am \'Yagami Raito \' ";
Console.WriteLine(s)
Kết quả xuất ra : I am ‘Yagami Raito ‘
 Các thao tác với chuỗi :
+ Phương thức ToString () : Dùng để chuyển đổi một đối tượng bất kỳ sang kiểu chuỗi
+ Chúng ta có thể nối các chuỗi với nhau một cách dễ dàng bằng cách sử dụng toán tử ‘+’
+ Trả về là độ dài của chuỗi (1 số nguyên dương) : str.Length
+ Nối chuỗi str2 sau chuỗi str1: string.Concat(s1, s2)
+ So sánh chuỗi str1 với chuỗi str2. Kiểu trả về là -1, 0, 1. (So sánh từng ký tự trong bảng mã ASCII) : string.Compare(str1, str2)
+ Thêm chuỗi str sau n ký tự của chuỗi s1 cần chèn : s1.Insert(n, str)
+ Thay thế chuỗi str1 bằng chuỗi str2 : s2 = s2.Replace(s2, s1)
+ Xóa khoảng trắng thừa 2 bên chuỗi : str = str.Trim()
+ IN HOA & chữ thường chuỗi str : string Upper = s1.ToUpper(); string Lower = s2.ToLower();

Bài 9: Thao tác với dữ liệu kiểu mảng trong C#

[Bài 9: Thao tác với dữ liệu kiểu mảng trong C#]
 Mảng là tập hợp của các phần tử cùng dạng và cùng loại.Có thể truy xuất được từng phần tử thông qua chỉ số(index) của nó.
Trước khi tạo ra một mảng,đầu tiên bạn phải lựa chọn loại phần tử sẽ được thực hiện.Nó là nhóm của các con số,nhóm của các ký tự..v.v. Những thông tin này sẽ cho phép trình biên dịch biết được phải dành ra bao nhiêu không gian trống cho mỗi phần tử của nhóm sẽ yêu cầu.Bởi vì mỗi phần tử của nhóm sẽ chiếm một không gian trống cho mình.Điều này cũng giống như các biến thông thường mà chúng ta vẫn dùng.
Bạn phải chỉ rõ số lượng phần tử sẽ được tạo thành của nhóm.Để trình biên dịch có thể cấp phát đầy đủ số lượng không gian trống của bộ nhớ.Số lượng các phần tử của mảng được đặc trong dấu ngoặc vuông.
<kiểu dữ liệu> [] <tên mảng> = new <kiểu dữ liệu> [<số phần tử>];
Ngoài ra,bạn có thể sử dụng từ khóa var để tạo ra một mảng.
var <tên mảng> = new <số phần tử>;
Ví dụ:
using System;
class program
{
static void Main()
{
int [] _arrays = new int [3];
}
}
Ví dụ: Sử dụng từ khóa var
using System;
class program
{
static void Main()
{
var [] _arrays = new int [3];
}
}
 Khởi tạo một mảng
Khi tạo ra một mảng, các phẩn tử của mảng đó sẽ được khởi gán một giá trị nhất định.
Ví dụ:
Int 0 float 0,0 double 0,0 char ‘’ string Null
Các cách khởi tạo phần tử cho mảng:
Cách 1: Trong c# mỗi chỉ số tương ứng với phần tử đó để xác định vị trí của phần tử ở trong mảng
using System;
class program
{
static void Main()
{
var _arrays = new int[3];
_arrays[0] = 1;
_arrays[1] = 3;
_arrays[2] = 5;
}
}
Cách 2: Bạn có thể khởi tạo mảng khi khai báo nó:
Ví dụ:
using System;
class program
{
static void Main()
{
var[] _arrays = new int[3] { 1, 3, 5 };
}
}
Với cách khởi tạo kiểu này bạn có thể để trống phần phần số phần tử.
using System;
class program
{
static void Main()
{
var[] _arrays = new int[] { 1, 3, 5 };
}
}
 Truy cập các thành viên của mảng
Sau khi khởi tạo một mảng,thì mỗi thành viên đã có một giá trị.Khi đó bạn có thể truy cập vào bất kì thành viên nào của mảng để thao tác và thậm chí là thay đổi giá trị của nó.
Để truy cập vào các thành viên của mảng,bạn có thể sử dụng chỉ số của nó.
Console.WriteLine( _array[chỉ số] );
- Sử dụng vòng for: Dùng để truy cập vào tất cả các thành viên trong mảng bằng chỉ số.
using System;
public class program
{
static void Main()
{
int[] _arrays = new int[] { 12, 52, 6, 24, 64 };
for (var i = 0; i < 5; i++)
Console.WriteLine(_arrays[i]);
}
}
 Thao tác với mảng trong C#
+ Ta có thể tìm được chiều dài của mảng sau nhờ vào thuộc tính Length thí dụ sau :
int arrayLength = integers.Length
+ Nếu các thành phần của mảng là kiểu định nghĩa trước (predefined types), ta có thể sắp xếp tăng dần vào phương thức gọi là static Array.Sort() method:
Array.Sort(myArray);
+ Ta có thể đảo ngược mảng đã có nhờ vào the static Reverse() method:
Array.Reverse(myArray);
+ Nếu bạn muốn phần tử xuất hiện cuối cùng ta dùng Array.LastIndexOf()
+ Dùng phương thức IndexOf , Phương thức sẽ duyệt lần lượt từng phần tử trong mảng: IndexOf(Array array, object value);
+ Để thêm phần tử vào mảng bạn sử dụng phương thức Array.SetValue()
+ Một khi mảng được khởi tạo,bạn có thể truy cập vào từng thành viên của nó.Để hỗ trợ cho việc truy cập này Class Array cung cấp phương thức GetValue()
+ Trong khi sử dụng mảng.Có những lúc ta phải thay đổi kích thước của mảng để làm việc. Ta sử dụng phương thức Copy có trong Class Array : Copy(Array, Array, Int32) (…)

Bài 8 : Toán tử & ưu tiên toán tử trong C#

[Bài 8 : Toán tử & ưu tiên toán tử trong C#]
 C# hỗ trợ các phép toán thong thường mà các bạn đã học từ mẫu giáo .Như :
Dấu cộng (+)
Dấu trừ (-)
Dấu nhân (*)
Dấu chia (/)
số dư (%) // 9 / 2 dư 1 9 % 2 = 1
Chúng được gọi là toán tử (operator) .
Vd: Console.WriteLine(8*4);
Không phải tất cả toán tử đều có thể áp dụng cho tất cả các kiểu dữ liệu.Các toán tử mà bạn có thể sử dụng trên một giá trị phụ thuộc vào kiểu giá trị đó.
Sử dụng toán tử cho kiểu chuỗi (string)
Vd :
Console.WriteLine("tam"*"ta"); // lỗi
Console.WriteLine("Thanh"+" Tam"); // Thanh Tam
 Quyền ưu tiên
Mình hiểu là cái gì trước cái gì sau 
Vd : 7+2*9 // 25
(+) hay (*).Chắc chắn rằng rất quan trọng vì nó thay đổi hoàn toàn đáp số nhận được.
Trong C# ,các toán tử ( *, / , % ) có quyền ưu tiên hơn các toán tử ( + , - )
Thứ tự tính toán các phép toán ưu tiên từ trái sang phải.
Nếu bạn muốn thay đổi quyền ưu tiên phép toán bằng phép toán khác.
(2+3)*4 // dùng dấu “( )”
5*4=20
 Toán tử tăng và giảm
Khi sử dụng các biến số ta thường có thao tác là cộng một giá trị vào biến, trừ đi một
giá trị từ biến đó, hay thực hiện các tính toán thay đổi giá trị của biến sau đó gán giá trị mới vừa tính toán cho chính biến đó.
Biến ++ : tăng biến lên 1 đơn vị
Biến -- : giảm biến xuống 1 đơn vị
Vd:
int i = 1;
i++;
Console.WriteLine(i);
Nếu muốn tăng i thêm 100.Bạn có thể làm như sau :
i = i + 100 ;
viết gọn lại thành :
i +=100 ; // hoặc nhân i*=100 …
 Toán tử quan hệ
Những toán tử quan hệ được dùng để so sánh giữa hai giá trị, và sau đó trả về kết quả
là một giá trị logic kiểu bool (true hay false). Ví dụ toán tử so sánh lớn hơn (>) trả về giá trị là true nếu giá trị bên trái của toán tử lớn hơn giá trị bên phải của toán tử. Do vậy 5 > 2 trả về một giá trị là true, trong khi 2 > 5 trả về giá trị false.
So sánh bằng ==
Khác !=
Nhỏ hơn <
Lớn hơn >
Nhỏ hơn hoặc bằng <=
Lớn hơn hoặc bằng >=
Lưu ý: == là toán tử so sánh và = là phép gán .
 Tiền tố và hậu tố
Lệnh 1 : A=B++; // dấu ++ nằm liền sau biến gọi là hậu tố
Gán trước rồi tăng sau. Vd: A= 10 , B=11
Lệnh 2 : A=++B; // dấu ++ nằm liền trước biến gọi là tiền tố
Tăng trước rồi gán sau. Vd : A= 11, B=11
 Toán tử logic
Trong câu lệnh if mà chúng ta đã tìm hiểu trong phần trước, thì khi điều kiện là true
thì biểu thức bên trong if mới được thực hiện. Đôi khi chúng ta muốn kết hợp nhiều điều kiện
với nhau như: bắt buộc cả hai hay nhiều điều kiện phải đúng hoặc chỉ cần một trong các điều kiện đúng là đủ hoặc không có điều kiện nào đúng...C# cung cấp một tập hợp các toán tử logic để phục vụ cho người lập trình.
+ Phép toán And (&&) // toán tử và .. cả 2 điều kiện phải đúng
int x = 10;
int y = 20;
if (x == 10 && y== 20)
Console.WriteLine("dung");
else
Console.WriteLine("sai");
+ Phép toán OR ( || ) // toán tử hoặc .. 1 trong 2 điều kiện đúng
int x = 10;
int y = 5;
if (x == 10 || y== 20)
Console.WriteLine("dung");
else
Console.WriteLine("sai");
+ Phép toán Not ( ! ) // phủ định . Đối với toán tử not, biểu thức sẽ có giá trị đúng khi điều kiện trong ngoặc là sai, và ngược lại,
int x = 3;
if (!(x == 3))
Console.WriteLine("dung");
else
Console.WriteLine("sai");
 Toán tử ba ngôi
Hầu hết các toán tử đòi hỏi có một toán hạng như toán tử (++, --) hay hai toán hạng như (+,-,*,/,...). Tuy nhiên, C# còn cung cấp thêm một toán tử có ba toán hạng (?:). Toán tử này có cú pháp sử dụng như sau: ( ? : )
Công thức : (Điều_kiện)?(Biểu thức 1):(Biểu thức 2);
Toán tử này sẽ xác định giá trị của một biểu thức điều kiện, và biểu thức điều kiện này phải trả về một giá trị kiểu bool. Khi điều kiện đúng thìsẽ được thực hiện, còn ngược lại điều kiện sai thì sẽ được thực hiện. Có thể diễn giải theo ngôn ngữ tự nhiên thì toán tử này có ý nghĩa : “Nếu điều kiện đúng thì làm công việc thứ nhất, còn ngược lại điều kiện sai thì làm công việc thứ hai”.
Vd:
int i = 5;
string test = i < 0 ? "i be hon 0" : "i lon hon 0";
Console.WriteLine(test);
Tương tự
int i = 5;
string test;
if (i < 0)
{
test = "i be hon 0";
}
else
{
test = "i lon hon 0";
}

Bài 7: Câu lệnh điều kiện - Cấu trúc lặp trong C#

[Bài 7: Câu lệnh điều kiện - Cấu trúc lặp trong C#]
 Khi bạn đã từng học 1 ngôn ngữ lập trình nào đó trước khi đọc bài này thì chắc rằng không còn xa lạ gì nữa về
- Câu lệnh điều kiện .
- Cấu trúc lặp .
 Câu lệnh điều kiện :
Khi bạn muốn chọn giữa việc thực thi 2 câu lệnh khác nhau. Phụ thuộc vào 1 kết quả .
 Bạn có thể sử dụng câu lệnh if .
Công thức:
If (điều_kiện_để_chạy)
Câu lệnh 1
Else // nếu điều kiện không đúng để lệnh 1 chạy
Câu lệnh 2
Ví dụ :
Console.WriteLine("nhap so ");
int i=int.Parse(Console.ReadLine());
if (i%2==0)
Console.WriteLine("so chan");
else
Console.WriteLine("so le");
Console.ReadLine();
Ví dụ này kiểm tra số chẵn lẻ bằng điều kiện if…else…
 Phân tầng các câu lệnh if.
Nếu bạn có nhiều câu lệnh cần kiểm tra thì đây là 1 lựa chọn
Công thức :
If (điều_kiện_để_chạy_lệnh_1)
Câu lệnh 1
Else if (điều_kiện_để_chạy_lệnh_2)
Câu lệnh 2
Else if (điều_kiện_để_chạy_lệnh_3)
Câu lệnh 3
Else if (điều_kiện_để_chạy_lệnh_4)
Câu lệnh 4
Else if (điều_kiện_để_chạy_lệnh_N)
Câu lệnh N
Else //nếu tất cả đều sai
câu lệnh chạy
ví dụ:
Console.WriteLine("nhap so ");
int i=int.Parse(Console.ReadLine());
if (i==0)
Console.WriteLine("0");
else if(i==1)
Console.WriteLine("1");
else if (i == 2)
Console.WriteLine("2");
else if (i == 3)
Console.WriteLine("3");
else
Console.WriteLine("ngoai vung");
Console.ReadLine();
 Câu lệnh switch.
Khi có quá nhiều điều kiện để kiểm tra thì câu lệnh if ..else.. trở nên rối và dài dòng.
Giải pháp của ta sẽ là switch
công thức :
switch (biểu thức điều kiện)
{
case (giá trị 1)
Các câu lệnh thực hiện
Break;
case (giá trị 2)
Các câu lệnh thực hiện
Break;
case (giá trị n)
Các câu lệnh thực hiện
Break;
default:
Các câu lệnh thực hiện mặc định
Break;
}
Bạn lưu ý : lệnh nhảy “Break;” bắt buộc phải có ở cuối câu lệnh như trên công thức và ví dụ dưới đây .
tt:;
Console.WriteLine("nhap so ");
int i=int.Parse(Console.ReadLine());
switch (i)
{
case 1:
Console.WriteLine("so 1");
break;
case 2:
Console.WriteLine("so 2");
break;
case 3:
Console.WriteLine("so 3");
break;
default:
goto tt;
}
Console.ReadLine();
Ở trên mình có sử dụng lệnh nhảy goto.nó sẽ nhảy đến tt:; tức là đầu chương trình trên ví dụ.
 Lệnh nhảy goto là một lệnh nhảy đơn giản, cho phép chương trình nhảy vô điều kiện tới một vị trí trong chương trình thông qua tên nhãn. Tuy nhiên việc sử dụng lệnh goto thường làm mất đi tính cấu trúc thuật toán, việc lạm dụng sẽ dẫn đến một chương trình nguồn mà giới lập trình gọi là “mì ăn liền” rối như mớ bòng bong vậy. Hầu hết các người lập trình có kinh nghiệm đều tránh dùng lệnh goto. Sau đây là cách sử dụng lệnh nhảy
goto:
Tạo một nhãn
goto đến nhãn
Nhãn là một định danh theo sau bởi dấu hai chấm (:). Thường thường một lệnh goto gắn với một điều kiện nào đó.
 Câu lệnh lặp :
C# cung cấp một bộ mở rộng các câu lệnh lặp, bao gồm các câu lệnh lặp for, while và do... while. Ngoài ra ngôn ngữ C# còn bổ sung thêm một câu lệnh lặp foreach.
 Vòng lặp for:
Lặp với điều kiện.
Bạn có thể khởi tạo 1 biến trong vòng lặp for.biến đó sẽ được định phạm vi trong phần thân của câu lệnh for và biến mất khi câu lệnh for hoàn tất.bạn không thể sử dụng nó khi vòng lặp for đã kết thúc,có thể tái sử dụng biến đó cho vòng lặp khác .
công thức :
for ([ phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp])
<Câu lệnh thực hiện>
Ví dụ :
for (int i = 0; i <= 10; i++)
{
Console.WriteLine(i);
}
Console.ReadLine();
 Vòng lặp while:
Trong khi điều kiện đúng thì thực hiện các công việc này
Chạy đến khi nào sai thì thôi 
Công thức :
while (Biểu thức)
<Câu lệnh thực hiện>
Ví dụ:
int i = 0;
while (i < 10)
{
Console.WriteLine(i);
i++;
}
Console.ReadLine();
Bạn nhớ phải đưa 1 lệnh để giá trị lặp có thể thay đổi từ true sang false. Để tránh vòng lặp này chạy vô tận. trong ví dụ trên mình sử dụng câu lệnh i++ để thực hiện
 Vòng lặp do...while .
làm điều này trong khi điều kiện vẫn còn đúng
Các câu lệnh while và for đều có điều kiện ở đầu vòng lặp. điều này có nghĩa nếu biểu thức đánh giá thành false thì sẽ không chạy dù chỉ 1 lần. câu lệnh do thì khác. Điều kiện ở cuối chương trình cho phép nó đánh giá sau mỗi lần lặp lại . Do đó phần thân sẽ thực thi tối thiểu 1 lần.
Công thức:
do
{
Câu lệnh
}
while <điều kiện>.
ví dụ :
int i = 0;
do
{
Console.WriteLine(i);
i++;
}
while (i < 10);
Console.ReadLine();
 Vòng lặp foreach:
Vòng lặp foreach cho phép tạo vòng lặp thông qua một tập hợp hay một mảng.
Do lặp dựa trên một mảng hay tập hợp nên toàn bộ vòng lặp sẽ duyệt qua tất cả các thành phần của tập hợp theo thứ tự được sắp. Khi duyệt đến phần tử cuối cùng trong tập hợp thì chương trình sẽ thoát ra khỏi vòng lặp foreach.
Công thức :
foreach ( <kiểu tập hợp> <tên truy cập thành phần > in < tên tập hợp>)
<Các câu lệnh thực hiện>
Ví dụ:
int[] a = { 6, 9, 96,69 };
foreach (int i in a)
{
Console.WriteLine(i);
}
Console.ReadLine();
 Câu lệnh nhảy break và continue :
Khi đang thực hiện các lệnh trong vòng lặp, có yêu cầu như sau: không thực hiện các lệnh còn lại nữa mà thoát khỏi vòng lặp, hay không thực hiện các công việc còn lại của vòng lặp hiện tại mà nhảy qua vòng lặp tiếp theo. Để đáp ứng yêu cầu trên C# cung cấp hai lệnh nhảy là break và continue để thoát khỏi vòng lặp.
Break khi được sử dụng sẽ đưa chương trình thoát khỏi vòng lặp và tiếp tục thực hiện các lệnh tiếp ngay sau vòng lặp.
Continue ngừng thực hiện các công việc còn lại của vòng lặp hiện thời và quay về đầu vòng lặp để thực hiện bước lặp tiếp theo
Hai lệnh break và continue tạo ra nhiều điểm thoát và làm cho chương trình khó hiểu cũng như là khó duy trì. Do vậy phải cẩn trọng khi sử dụng các lệnh nhảy này.
Ví dụ :
int i = -7;
while (true)
{
Console.WriteLine(i);
i++;
if (i < 10)
continue;
else
break;

}
Console.WriteLine("thoát vòng lặp");
Console.ReadLine();