2010年9月30日 星期四

windows 如何判斷64位元環境

由於很多的原因,所以要在windows上面偵測64位元環境的最好方法還是使用WMI比較方便

這邊是一個簡單範例
public static bool DetectIf64bit()
{
bool Is64Bit;
ObjectQuery objQry;
ManagementScope mngScope;
ConnectionOptions connOpt = new ConnectionOptions();
ManagementObjectSearcher searcher;

//-----設定 WMI 連接資訊-----
connOpt.Username = ""; // 登入系統的帳號
connOpt.Password = ""; // 密碼
connOpt.Authentication = AuthenticationLevel.Default; // 連線驗證方式
mngScope = new ManagementScope();
mngScope.Path = new ManagementPath(@"\\.\root\cimv2");
mngScope.Connect();

//----- 透過WMI擷取CPU定址長度資訊
objQry = new ObjectQuery("SELECT * FROM Win32_Processor");
searcher = new ManagementObjectSearcher(mngScope, objQry);
Is64Bit = false;

foreach (ManagementObject QryObj in searcher.Get())
{
if (QryObj.GetPropertyValue("AddressWidth").ToString().Trim() == "64")
{
Is64Bit = true;
break;
}
}

return (Is64Bit);
}

Winform下comboxBox處理 找出下拉選單對應值

winform下的下拉選單是各很機車的設計..

datasource程式碼
DataTable p_dt = dbHelper.mtdExecuteDataTable(p_exec);
DataRow emptyRow = p_dt.NewRow();
emptyRow["code_desc"] = "";
emptyRow["code_id"] = " ";
p_dt.Rows.InsertAt(emptyRow, 0);
cmbBox_paymentType.DataSource = p_dt;
cmbBox_paymentType.DisplayMember = "code_desc";
cmbBox_paymentType.ValueMember = "code_id";
cmbBox_paymentType.SelectedIndex = 0;

使用非datatable作為來源時,另建一個簡單類別或自訂table設定columns也可
如DataTable dt = new DataTable("tbl");
dt.columns.add("0", Typeof(System.string));
dt.columns.add("1", Typeof(System.string));
DataRow row;
for(int i=0;i<2;i++) {
row = dt.newrow();
row["0"] = i;
row["1"] = i+1;
dt.row.add(row);
}

在已經有資料要挑選正確的項目作為預選項目時
將dropdownobx的items以datarowview處理即可
大致程式碼會如下

if (!string.IsNullOrEmpty(p_bo_tblinvoice_out.code_desc))
{
int i=0;
foreach (DataRowView _drv in cmbBox_paymentType.Items)
{
if (_drv.Row["code_desc"].ToString().Contains(p_bo_tblinvoice_out.code_desc))
cmbBox_paymentType.SelectedIndex = i;
i += 1;
}
}

2010年9月17日 星期五

刪除被鎖定的檔案

如果你是尋找可以立即使用的軟體,那這篇對你無用
這篇是針對如何使用程式刪除檔案的筆記 (意思就是我看了但還沒測試 :p

原始網頁 http://stackoverflow.com/questions/317071/how-do-i-find-out-which-process-is-locking-a-file-c

1. 使用MS的Handle v3.42工具輔助
下載http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
使用以下程式碼呼叫

 string fileName = @"c:\aaa.doc";//Path to locked file

                Process tool = new Process();
                tool.StartInfo.FileName = "handle.exe";
                tool.StartInfo.Arguments = fileName;
                tool.StartInfo.UseShellExecute = false;
                tool.StartInfo.RedirectStandardOutput = true;
                tool.Start();                   
                tool.WaitForExit();
                string outputTool = tool.StandardOutput.ReadToEnd();

                string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)";
                foreach(Match match in Regex.Matches(outputTool, matchPattern))
                {
                        Process.GetProcessById(int.Parse(match.Value)).Kill();
                }

2. 取得process陣列,判斷是哪各process鎖定檔案
不過原作者說這作法無法取得txt之類的鎖定來源


using System.Management; using System.IO;   
static class Module1 { static internal ArrayList myProcessArray = new ArrayList(); private static Process myProcess; 
public static void Main() { 

    string strFile = "c:\\windows\\system32\\msi.dll"; 
    ArrayList a = getFileProcesses(strFile); 
    foreach (Process p in a) { 
        Debug.Print(p.ProcessName); 
    } }
private static ArrayList getFileProcesses(string strFile) { 
    myProcessArray.Clear(); 
    Process[] processes = Process.GetProcesses; 
    int i = 0; 
    for (i = 0; i <= processes.GetUpperBound(0) - 1; i++) { 
        myProcess = processes(i); 
        if (!myProcess.HasExited) { 
            try { 
                ProcessModuleCollection modules = myProcess.Modules; 
                int j = 0; 
                for (j = 0; j <= modules.Count - 1; j++) { 
                    if ((modules.Item(j).FileName.ToLower.CompareTo(strFile.ToLower) == 0)) { 
                        myProcessArray.Add(myProcess); 
                        break; // TODO: might not be correct. Was : Exit For 
                    } 
                } 
            } 
            catch (Exception exception) { 
            } 
            //MsgBox(("Error : " & exception.Message)) 
        } 
    } 
    return myProcessArray; } }


3.算是進階版?
using System;
using System.Collections;
using System.Diagnostics;
using System.Management;
using System.IO;
static class Module1
{
    static internal ArrayList myProcessArray = new ArrayList();
    private static Process myProcess;

    public static void Main()
    {
        string strFile = "c:\\windows\\system32\\msi.dll";
        ArrayList a = getFileProcesses(strFile);
        foreach (Process p in a)
        {
            Debug.Print(p.ProcessName);
        }
    }

    private static ArrayList getFileProcesses(string strFile)
    {
        myProcessArray.Clear();
        Process[] processes = Process.GetProcesses();
        int i = 0;
        for (i = 0; i <= processes.GetUpperBound(0) - 1; i++)
        {
            myProcess = processes[i];
            //if (!myProcess.HasExited) //This will cause an "Access is denied" error
            if (myProcess.Threads.Count > 0)
            {
                try
                {
                    ProcessModuleCollection modules = myProcess.Modules;
                    int j = 0;
                    for (j = 0; j <= modules.Count - 1; j++)
                    {
                        if ((modules[j].FileName.ToLower().CompareTo(strFile.ToLower()) == 0))
                        {
                            myProcessArray.Add(myProcess);
                            break;
                            // TODO: might not be correct. Was : Exit For
                        }
                    }
                }
                catch (Exception exception)
                {
                    //MsgBox(("Error : " & exception.Message)) 
                }
            }
        }

        return myProcessArray;
    }
}