C#訪問文件路徑通用類

lpkde 9年前發布 | 2K 次閱讀 C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace Utility

{

/// <summary>

/// @Author:梁繼龍

/// @Date:2012/8/1

/// @Email:jilongliang1988ora@163.com

/// @Description:文件處理類

/// </summary>

public class AccessDirFileHelper

{

    public static AccessDirFileHelper instance = null;

    private static readonly object lockObj = new object();

    protected static System.Reflection.Assembly assembly = null; //反射 

    /// <summary>

    /// 單例模式

    /// </summary>

    /// <returns></returns>

    public static AccessDirFileHelper GetInstance()

    {

        //lock (AccessFileHelper.instance){ }

        if (instance == null)

        {

            lock (lockObj)

            {

                instance = new AccessDirFileHelper();

            }

        }

        return instance;

    }



    /// <summary>

    /// 獲取當前進程的完整路徑,包含文件名(進程名)

    /// result: X:\xxx\xxx\xxx.exe (.exe文件所在的目錄+.exe文件名

    /// </summary>

    /// <returns></returns>

    public string GetLocalProcessFileName()

    {

        try

        {

            return this.GetType().Assembly.Location;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }



    /// <summary>

    /// 獲取新的 Process 組件并將其與當前活動的進程關聯的主模塊的完整路徑,包含文件名(進程名).

    //result: X:\xxx\xxx\xxx.exe (.exe文件所在的目錄+.exe文件名)

    /// </summary>

    /// <returns></returns>

    public string GetCurrentProcessFileNamePath()

    {

        try

        {

            return System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }



    /// <summary>

    /// 獲取和設置當前目錄(即該進程從中啟動的目錄)的完全限定路徑.

    /// result: X:\xxx\xxx (.exe文件所在的目錄)

    /// </summary>

    /// <returns></returns>

    public String GetCurrentEnvironmentDirectoryPath()

    {

        try

        {

            return System.Environment.CurrentDirectory;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }



    /// <summary>

    /// 獲取當前 Thread 的當前應用程序域的基目錄,它由程序集沖突解決程序用來探測程序集。

    ///string str = System.AppDomain.CurrentDomain.BaseDirectory;

    ///result: X:\xxx\xxx\ (.exe文件所在的目錄+"\")

    ///Example:用來判斷winfrom會少一個Debug  E:\\ASP.NET\\MyApp\\WebApp\\bin\\Debug\\bin\\Utility.dll"  web

    ///Example:用來判斷winfrom會多一個Debug  E:\\ASP.NET\\MyApp\\WinApp\\bin\\Debug\\Utility.dll"  winform

    ///此方法一般判斷一個解決方案啟動是web還是winform讀取文件(dll,config,txt等..)看情況定

    /// </summary>

    public string GetCurrentDomainBaseDirectory()

    {

        try

        {   //效果一樣

            //System.Threading.Thread.GetDomain().BaseDirectory

            return System.AppDomain.CurrentDomain.BaseDirectory;

        }

        catch (Exception e)

        {

            throw e;

        }

    }



    /// <summary>

    /// 獲取和設置包含該應用程序的目錄的名稱。

    ///string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

    ///result: X:\xxx\xxx\ (.exe文件所在的目錄+"\")

    /// </summary>

    /// <returns></returns>

    public string GetCurrentDomainSetupInformationName()

    {

        try

        {

            return System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }



    /// <summary>

    /// 獲取啟動了應用程序的可執行文件的路徑,不包括可執行文件的名稱

    /// string str = System.Windows.Forms.Application.StartupPath;

    /// result: X:\xxx\xxx (.exe文件所在的目錄)

    /// </summary>

    /// <returns></returns>

    public  string GetWindowsApplicationStartupPath()

    {

        try

        {

            return System.Windows.Forms.Application.StartupPath;

        }

        catch (Exception e)

        {

            throw e;

        }

    }



    /// <summary>

    ///獲取啟動了應用程序的可執行文件的路徑,包括可執行文件的名稱。

    ///string str = System.Windows.Forms.Application.ExecutablePath;

    ///result: X:\xxx\xxx\xxx.exe (.exe文件所在的目錄+.exe文件名)

    /// </summary>

    /// <returns></returns>

    public string GetWindowsExecutablePath()

    {

        try

        {

            return System.Windows.Forms.Application.ExecutablePath;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }



    /// <summary>

    /// 獲取應用程序的當前工作目錄(不可靠)

    /// /string str = System.IO.Directory.GetCurrentDirectory();

    /// result: X:\xxx\xxx (.exe文件所在的目錄)

    /// </summary>

    /// <returns></returns>

    public string GetCurrentDirectory()

    {

        try

        {

            return System.IO.Directory.GetCurrentDirectory();

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }

    /// <summary>

    /// 這個方法的意思是:在同一個解決方案里面有兩個工程,啟動的時候

    /// 去判斷哪個工程是Winform或者是Web的配置

    ///Example:E:\\ASP.NET\\MyApp\\WinApp\\bin\\Debug\\MyApp.vshost.exe.Config" //winform

    ///Example:"E:\\ASP.NET\\MyApp\\WebApp\\web.config"  //web

    ///從后面的配置截取Example:String index=Path3.Substring(config.Length - 8);截取

    ///后面字符串判去判斷,最好把都轉換成小寫或者大寫

    ///index.ToUpper()="E.CONFIG"   /   index.ToLower()=="e.config"

    /// </summary>

    /// <returns></returns>

    public System.Reflection.Assembly GetCurrentDomainConfigurationFile(string executeWinformConfig, string executeWebConfig)

    {

        try

        {

            string config = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

            string index = config.Substring(config.Length - 8);



            if (index.ToLower() == "e.config")  //把截取到的字符串轉為為小寫

            {

                assembly = System.Reflection.Assembly.LoadFile(executeWinformConfig); //加載dll文件

            }

            if (index.ToLower() == "b.config")

            {

                assembly = System.Reflection.Assembly.LoadFile(executeWebConfig); //加載dll文件

            }

            return assembly;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }

    /// <summary>

    /// 無參數的GetCurrentDomainConfigurationFile方法

    /// GetCurrentDomainConfigurationFile

    /// </summary>

    /// <returns></returns>

    public string GetCurrentDomainConfigurationFile()

    {

        try

        {

            return AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }



    /// <summary>

    /// Application.StartupPath與AppDomain.CurrentDomain.BaseDirectory都是判斷

    /// 當前啟動的工程,并體現能找到

    /// Example:E:\\ASP.NET\\MyApp\\MyApp\\bin\\Debug路徑下面,唯有不同的就是

    /// AppDomain.CurrentDomain.BaseDirectory多了個 \\

    /// Application.StartupPath而且是System.Windows.Forms

    /// </summary>

    /// <returns></returns>

    public string GetStartupPath()

    {

        try

        {

            return System.Windows.Forms.Application.StartupPath;

        }

        catch (Exception)

        {

            throw;

        }

    }



    /// <summary>

    /// 獲取文件的大小,一般指文件有多少個字節

    /// </summary>

    /// <param name="fileName"></param>

    /// <returns></returns>

    public string GetFileSize(string fileName)

    {

        try

        {

            if (File.Exists(fileName))

            {

                return Convert.ToString(new FileInfo(fileName).Length);

            }

            else

                return fileName;

        }

        catch (Exception)

        {

            throw;

        }

    }

    ///<summary>

    ///在卸載程序獲取系統安裝的目錄:

    ///System.Reflection.Assembly curPath = System.Reflection.Assembly.GetExecutingAssembly();

    /// string path=curPath.Location;//得到安裝程序類SetupLibrary文件的路徑,獲取這個文件路徑

    ///所在的目錄即得到安裝程序的目錄;

    ///</summary>

    /// <returns></returns>

    public String GetExecutingAssemblyDirectory()

    {

        try

        {

            System.Reflection.Assembly curPath = System.Reflection.Assembly.GetExecutingAssembly();

            string path = curPath.Location;

            return path;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }





    #region



    /// <summary>

    /// 創建目錄

    /// </summary>

    /// <param name="dir">此地路徑相對站點而言</param>

    public static void CreateDir(string dir)

    {

        if (dir.Length == 0) return;

        if (!System.IO.Directory.Exists(System.Web.HttpContext.Current.Server.MapPath(dir)))

            System.IO.Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath(dir));

    }

    /// <summary>

    /// 創建目錄路徑

    /// </summary>

    /// <param name="folderPath">物理路徑</param>

    public static void CreateFolder(string folderPath)

    {

        if (!System.IO.Directory.Exists(folderPath))

            System.IO.Directory.CreateDirectory(folderPath);

    }

    /// <summary>

    /// 刪除目錄

    /// </summary>

    /// <param name="dir">此地路徑相對站點而言</param>

    public static void DeleteDir(string dir)

    {

        if (dir.Length == 0) return;

        if (System.IO.Directory.Exists(System.Web.HttpContext.Current.Server.MapPath(dir)))

            System.IO.Directory.Delete(System.Web.HttpContext.Current.Server.MapPath(dir), true);

    }

    /// <summary>

    /// 判斷文件是否存在

    /// </summary>

    /// <param name="file">格式:a/b.htm,相對根目錄</param>

    /// <returns></returns>

    public static bool FileExists(string file)

    {

        if (File.Exists(System.Web.HttpContext.Current.Server.MapPath(file)))

            return true;

        else

            return false;

    }

    /// <summary>

    /// 讀取文件內容

    /// </summary>

    /// <param name="file">格式:a/b.htm,相對根目錄</param>

    /// <returns></returns>

    public static string ReadFile(string file)

    {

        if (!FileExists(file))

            return "";

        try

        {

            System.IO.StreamReader sr = new System.IO.StreamReader(System.Web.HttpContext.Current.Server.MapPath(file), System.Text.Encoding.UTF8);

            string str = sr.ReadToEnd();

            sr.Close();

            return str;

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }

    /// <summary>

    /// 保存為不帶Bom的文件

    /// </summary>

    /// <param name="TxtStr"></param>

    /// <param name="tempDir">格式:a/b.htm,相對根目錄</param>

    public static void SaveFile(string TxtStr, string tempDir)

    {

        SaveFile(TxtStr, tempDir, true);

    }

    /// <summary>

    /// 保存文件內容,自動創建目錄

    /// </summary>

    /// <param name="TxtStr"></param>

    /// <param name="tempDir">格式:a/b.htm,相對根目錄</param>

    /// <param name="noBom"></param>

    public static void SaveFile(string TxtStr, string tempDir, bool noBom)

    {

        try

        {

            CreateDir(GetFolderPath(true, tempDir));

            System.IO.StreamWriter sw;

            if (noBom)

                sw = new System.IO.StreamWriter(System.Web.HttpContext.Current.Server.MapPath(tempDir), false, new System.Text.UTF8Encoding(false));

            else

                sw = new System.IO.StreamWriter(System.Web.HttpContext.Current.Server.MapPath(tempDir), false, System.Text.Encoding.UTF8);



            sw.Write(TxtStr);

            sw.Close();

        }

        catch (Exception ex)

        {

            throw ex;

        }

    }

    /// <summary>

    /// 復制文件

    /// 這個方法在6.0版本后改寫,雖看似比前面的版本冗長,但避免了file2文件一直被占用的問題

    /// </summary>

    /// <param name="file1"></param>

    /// <param name="file2"></param>

    /// <param name="overwrite">如果已經存在是否覆蓋?</param>

    public static void CopyFile(string file1, string file2, bool overwrite)

    {

        if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(file1)))

        {

            if (overwrite)

                System.IO.File.Copy(System.Web.HttpContext.Current.Server.MapPath(file1), System.Web.HttpContext.Current.Server.MapPath(file2), true);

            else

            {

                if (!System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(file2)))

                    System.IO.File.Copy(System.Web.HttpContext.Current.Server.MapPath(file1), System.Web.HttpContext.Current.Server.MapPath(file2));

            }

        }

    }

    /// <summary>

    /// 刪除文件

    /// </summary>

    /// <param name="file">此地路徑相對程序路徑而言</param>

    public static void DeleteFile(string file)

    {

        if (file.Length == 0) return;

        if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(file)))

            System.IO.File.Delete(System.Web.HttpContext.Current.Server.MapPath(file));

    }

    /// <summary>

    /// 獲得文件的目錄路徑

    /// </summary>

    /// <param name="filePath">文件路徑</param>

    /// <returns>以\結尾</returns>

    public static string GetFolderPath(string filePath)

    {

        return GetFolderPath(false, filePath);

    }

    /// <summary>

    /// 獲得文件的目錄路徑

    /// </summary>

    /// <param name="isUrl">是否是網址</param>

    /// <param name="filePath">文件路徑</param>

    /// <returns>以\或/結尾</returns>

    public static string GetFolderPath(bool isUrl, string filePath)

    {

        if (isUrl)

            return filePath.Substring(0, filePath.LastIndexOf("/") + 1);

        else

            return filePath.Substring(0, filePath.LastIndexOf("\\") + 1);

    }

    /// <summary>

    /// 獲得文件的名稱

    /// </summary>

    /// <param name="filePath"></param>

    /// <returns></returns>

    public static string GetFileName(string filePath)

    {

        return GetFileName(false, filePath);

    }

    /// <summary>

    /// 獲得文件的名稱

    /// </summary>

    /// <param name="isUrl">是否是網址</param>

    /// <param name="filePath"></param>

    /// <returns></returns>

    public static string GetFileName(bool isUrl, string filePath)

    {

        if (isUrl)

            return filePath.Substring(filePath.LastIndexOf("/") + 1, filePath.Length - filePath.LastIndexOf("/") - 1);

        else

            return filePath.Substring(filePath.LastIndexOf("\\") + 1, filePath.Length - filePath.LastIndexOf("\\") - 1);

    }

    /// <summary>

    /// 獲得文件的后綴

    /// 不帶點,小寫

    /// </summary>

    /// <param name="filePath"></param>

    /// <returns></returns>

    public static string GetFileExt(string filePath)

    {

        return filePath.Substring(filePath.LastIndexOf(".") + 1, filePath.Length - filePath.LastIndexOf(".") - 1).ToLower();

    }

    /// <summary>

    /// 目錄拷貝

    /// </summary>

    /// <param name="OldDir"></param>

    /// <param name="NewDir"></param>

    public static void CopyDir(string OldDir, string NewDir)

    {

        DirectoryInfo OldDirectory = new DirectoryInfo(OldDir);

        DirectoryInfo NewDirectory = new DirectoryInfo(NewDir);

        CopyDir(OldDirectory, NewDirectory);

    }

    private static void CopyDir(DirectoryInfo OldDirectory, DirectoryInfo NewDirectory)

    {

        string NewDirectoryFullName = NewDirectory.FullName + "\\" + OldDirectory.Name;



        if (!Directory.Exists(NewDirectoryFullName))

            Directory.CreateDirectory(NewDirectoryFullName);



        FileInfo[] OldFileAry = OldDirectory.GetFiles();

        foreach (FileInfo aFile in OldFileAry)

            File.Copy(aFile.FullName, NewDirectoryFullName + "\\" + aFile.Name, true);



        DirectoryInfo[] OldDirectoryAry = OldDirectory.GetDirectories();

        foreach (DirectoryInfo aOldDirectory in OldDirectoryAry)

        {

            DirectoryInfo aNewDirectory = new DirectoryInfo(NewDirectoryFullName);

            CopyDir(aOldDirectory, aNewDirectory);

        }

    }

    /// <summary>

    /// 目錄刪除

    /// </summary>

    /// <param name="OldDir"></param>

    public static void DelDir(string OldDir)

    {

        DirectoryInfo OldDirectory = new DirectoryInfo(OldDir);

        OldDirectory.Delete(true);

    }



    /// <summary>

    /// 目錄剪切

    /// </summary>

    /// <param name="OldDirectory"></param>

    /// <param name="NewDirectory"></param>

    public static void CopyAndDelDir(string OldDirectory, string NewDirectory)

    {

        CopyDir(OldDirectory, NewDirectory);

        DelDir(OldDirectory);

    }

    /// <summary>

    /// 文件下載

    /// </summary>

    /// <param name="_Request"></param>

    /// <param name="_Response"></param>

    /// <param name="_fullPath">源文件路徑</param>

    /// <param name="_speed"></param>

    /// <returns></returns>

    public static bool DownloadFile(System.Web.HttpRequest _Request, System.Web.HttpResponse _Response, string _fullPath, long _speed)

    {

        string _fileName = GetFileName(false, _fullPath);

        try

        {

            FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            BinaryReader br = new BinaryReader(myFile);

            try

            {

                _Response.AddHeader("Accept-Ranges", "bytes");

                _Response.Buffer = false;

                long fileLength = myFile.Length;

                long startBytes = 0;



                double pack = 10240; //10K bytes

                //int sleep = 200;   //每秒5次   即5*10K bytes每秒

                int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;

                if (_Request.Headers["Range"] != null)

                {

                    _Response.StatusCode = 206;

                    string[] range = _Request.Headers["Range"].Split(new char[] { '=', '-' });

                    startBytes = Convert.ToInt64(range[1]);

                }

                _Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());

                _Response.AddHeader("Connection", "Keep-Alive");

                _Response.ContentType = "application/octet-stream";

                _Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8));



                br.BaseStream.Seek(startBytes, SeekOrigin.Begin);

                int maxCount = (int)Math.Floor((fileLength - startBytes) / pack) + 1;



                for (int i = 0; i < maxCount; i++)

                {

                    if (_Response.IsClientConnected)

                    {

                        _Response.BinaryWrite(br.ReadBytes(int.Parse(pack.ToString())));

                        System.Threading.Thread.Sleep(sleep);

                    }

                    else

                    {

                        i = maxCount;

                    }

                }

            }

            catch

            {

                return false;

            }

            finally

            {

                br.Close();

                myFile.Close();

            }

        }

        catch

        {

            return false;

        }

        return true;

    }

    #endregion



}

} </pre>

 本文由用戶 lpkde 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!