前端學PHP之文件操作

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/11/24/6088999.html
-Advertisement-
Play Games

[1]文件類型 [2]文件屬性 [3]目錄路徑 [4]目錄遍歷 [5]目錄統計 [6]目錄增刪 [7]目錄複製 [8]文件操作 [9]文件內容 ...


×
目錄
[1]文件類型 [2]文件屬性 [3]目錄路徑[4]目錄遍歷[5]目錄統計[6]目錄增刪[7]目錄複製[8]文件操作[9]文件內容

前面的話

  在程式運行時,程式本身和數據一般都存在記憶體中,當程式運行結束後,存放在記憶體中的數據被釋放。如果需要長期保存程式運行所需的原始數據,或程式運行產生的結果,就需要把數據存儲在文件或資料庫。一般地,小型數據存儲在文件中,海量數據存儲在資料庫中。本文主要介紹php中目錄和文件的基本操作

 

文件類型

  文件一般指存儲在外部介質上具有名字(文件名)的一組相關數據集合。用文件可長期保存數據,並實現數據共用

  PHP是以UNIX的文件系統為模型的。因此在Windows系統中我們只能獲得”file”、”dir”或者“unknown”三種文件類型。而在UNIX系統中,我們可以獲得block、char、dir、fifo、file、link和unknown七種類型

  可以使用函數filetype()獲取文件的具體類型,可能的值有fifo,char,dir,block,link,file 和 unknown

string filetype ( string filename ) 

  如果出錯則返回 FALSE。如果調用失敗或者文件類型未知的話 filetype() 還會產生一個 E_NOTICE 消息

  在伺服器中新建一個目錄test,併在目錄中新建一個文件a.txt

<?php
echo filetype('test/a.txt');  // file
echo filetype('test/');        // dir
echo filetype('test/b.txt');  // Warning: filetype(): Lstat failed for test/b.txt
?>

  在這7種文件類型中,window系統常用的是'file'和'dir'這兩種,它們配套的類型檢測函數分別是is_dir( )和is_file( )

is_dir( )

  判斷給定文件名是否是一個目錄。如果文件名存在並且是一個目錄則返回 true,否則返回 false 

bool is_dir(_name)

is_file( )

  判斷給定文件名是否為一個正常的文件,如果文件存在且為正常的文件則返回 true 

bool is_file(_name)    
<?php
var_dump (is_file('test/a.txt'));  //boolean true
var_dump (is_dir('test/'));        //boolean true
?>

 

文件屬性

  一般地,在文件或目錄右鍵菜單中,選擇屬性,即可查看文件的屬性

  下表中列出了php中關於文件屬性的常用函數

<?php
var_dump (file_exists('test/a.txt'));  //boolean true
var_dump (filesize('test/a.txt'));  // int 0 
var_dump (is_readable('test/a.txt'));  //boolean true
var_dump (is_writeable('test/a.txt'));  //boolean true
var_dump (is_executable('test/a.txt'));  //boolean false
var_dump (date("Y-m-d H:i:s",(filectime('test/a.txt'))));//string '2016-11-22 06:47:54' (length=19)
var_dump (date("Y-m-d H:i:s",(filemtime('test/a.txt'))));//string '2016-11-22 06:47:54' (length=19)
var_dump (date("Y-m-d H:i:s",(fileatime('test/a.txt'))));//string '2016-11-22 06:47:54' (length=19)
?>

 

目錄路徑

  windows下的目錄路徑使用是正斜杠(\),而unix下的目錄路徑使用是反斜杠(/)

$unixPath="/var/www/html/index.php";    
    //在UNIX系統中的絕對路徑,必須使用"/"分隔
$winPath="C:\\Appserv\\www\\index.php"; 
    //在Windows系統的絕對路徑,預設使用"\"分隔
$winPath2="C:/Appserv/www/index.php";   
    //在Windows系統中也可使用“/”分隔

  因為在Windows系統中也可使用(/)分隔。所以,在PHP中,不論是什麼操作系統,全部都使用反斜杠(/)代表路徑分隔符號 

  在PHP中,還提供了一個常量DIRECTORY_SEPARATOR,以此來代表目錄分隔符,但寫起來較麻煩

<?php
echo "c:".DIRECTORY_SEPARATOR."a".DIRECTORY_SEPARATOR."b".DIRECTORY_SEPARATOR."c"; //c:\a\b\c
?>

  在windows下多個路徑的分隔符使用分號(;)分隔,而unix下使用冒號(:)分隔

  在PHP中,提供了一個常量PATH_SEPARATOR,用來在跨平臺的情況下,表示多個路徑之間的分隔符

<?php
echo "aaa/ccc/ddd".PATH_SEPARATOR."/www/yyyy";//aaa/ccc/ddd;/www/yyyy
?>

換行 

  在window下,換行是\r\n,而在unix下,換行是\n。通常在寫程式中,換行就以unix為準,寫作\n

  同樣地,PHP提供了一個常量PHP_EOL,用來在跨平臺的情況下,表示換行

.和..

  在PHP中,.表示當前目錄,..表示上一級目錄

<?php
var_dump (file_exists('test/a.txt'));//boolean true
var_dump (file_exists('./test/a.txt'));//boolean true
var_dump (file_exists('../www/test/a.txt'));//boolean true
?>

根路徑

  有兩種根路徑需要進行區分,一種是客戶端根路徑,一種是伺服器根路徑

  以我自己在d盤安裝的wamp為例,客戶端根路徑指'd:\wamp\www\',而伺服器根路徑為為'd:\'

<?php
echo '<img src="/a.jpg">';//客戶端根路徑,相當於d:\wamp\www\a.jpg
mkdir('/hello');//伺服器根路徑,相當於d:\hello
?>

路徑解析函數

【basename()】

  basename()函數用於返迴路徑中的文件名部分

<?php
echo "1) ".basename("/etc/sudoers.d", ".d");//1) sudoers
echo "2) ".basename("/etc/passwd").PHP_EOL;//2) passwd
echo "3) ".basename("/etc/").PHP_EOL;//3) etc
echo "4) ".basename(".").PHP_EOL;//4) .
echo "5) ".basename("/");//5) 
?>

【dirname()】

  dirname()函數用於返迴路徑中的目錄部分

<?php
echo "1) " . dirname("/etc/passwd") . PHP_EOL; // 1) /etc
echo "2) " . dirname("/etc/") . PHP_EOL; // 2) \
echo "3) " . dirname("."); // 3) .
?>

【pathinfo()】

  pathinfo()函數用於返迴文件路徑的信息

<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
echo $path_parts['dirname'], "\n";// '/www/htdocs/inc' 目錄名
echo $path_parts['basename'], "\n";// 'lib.inc.php' 文件名
echo $path_parts['extension'], "\n";// 'php' 文件尾碼
echo $path_parts['filename'], "\n"; // 'lib.inc' 文件名不帶尾碼
?>

【realpath()】

  realpath()函數用於返回規範化的絕對路徑名

  在Windows上,realpath()會將unix風格的路徑改成Windows風格的

<?php
echo realpath('/wamp');// 'D:\wamp'
?>

 

目錄遍歷

glob()

  glob()函數用於尋找與模式匹配的文件路徑

array glob ( string $pattern [, int $flags = 0 ] )

  在www目錄下新建a.txt和b.txt文件

<?php
foreach (glob("*.txt") as $filename) {
    //a.txt size 1050 b.txt size 73
    echo "$filename size " . filesize($filename) . "\n";
}
?>

opendir()

  opendir()函數用於打開目錄句柄。如果成功則返回目錄句柄的resource,失敗則返回 FALSE

resource opendir ( string $path [, resource $context ] )
<?php
var_dump(opendir('test'))//resource(3, stream)
?>

closedir()

  closedir()函數用於關閉目錄句柄

void closedir ([ resource $dir_handle ] )

  參數dir_handle表示目錄句柄的 resource,之前由 opendir()所打開的。如果目錄句柄沒有指定,那麼會假定為是opendir()所打開的最後一個句柄

<?php
$dir = opendir('test');
closedir($dir);
?>

readdir()

  readdir()函數用於從目錄句柄中讀取條目,返回目錄中下一個文件的文件名。文件名以在文件系統中的排序返回,失敗時返回 FALSE

string readdir ([ resource $dir_handle ] )

  在www目錄下新建目錄test,併在目錄test下新建a.txt和b.txt文件

<?php
$dir = opendir('test');
echo readdir($dir)."<br>";//.
echo readdir($dir)."<br>";//..
echo readdir($dir)."<br>";//a.txt
echo readdir($dir)."<br>";//b.txt
echo readdir($dir)."<br>";//
closedir($dir);
?>

  在遍歷目錄時,每個目錄的前兩個返回值都是.和..,.代表當前目錄,..代表上一級目錄

  所以,一般地,列出當前目錄的所有文件並去掉 . 和 ..,常採用下麵的代碼

<?php
if ($handle = opendir('test')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo "$file\n";
        }
    }
    closedir($handle);
}
?>

  接下來,在test目錄下,新建一個目錄in,併在in目錄中新建文件c.txt。然後,目錄和文件區分顯示

  [註意]通過is_dir()函數判斷目錄時,需要加入路徑

<?php
if ($handle = opendir('test')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目錄:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    closedir($handle);
}
/*
文件:test/a.txt
文件:test/b.txt
目錄:test/in
 */
?>    

rewinddir()

  rewinddir()函數用於倒回目錄句柄,將參數dir_handle指定的目錄流重置到目錄的開頭

void rewinddir ( resource $dir_handle )

  如果不使用rewinddir()函數,則文件只能遍歷一次

<?php
if ($handle = opendir('test')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目錄:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目錄:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    closedir($handle);
}

/*
文件:test/a.txt
文件:test/b.txt
目錄:test/in
 */
?>

  使用rewinddir()函數,可以把目錄句柄返回到第一個文件,從而實現重新遍歷

<?php
if ($handle = opendir('test')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目錄:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    rewinddir($handle);
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目錄:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    closedir($handle);
}

/*
文件:test/a.txt
文件:test/b.txt
目錄:test/in
文件:test/a.txt
文件:test/b.txt
目錄:test/in
 */
?>

 

目錄統計

disk_total_space()

  disk_total_space()函數返回一個目錄的磁碟總大小

float disk_total_space ( string $directory )
<?php
$ds = disk_total_space("C:");
echo $ds."<br>";//126652637184
$ds = disk_total_space("D:");
echo $ds;//1000202240000
?>

disk_free_space()

  disk_free_space()函數返回目錄中的可用空間

float disk_free_space ( string $directory )
<?php
$ds = disk_free_space("C:");
echo $ds."<br>";//86087041024
$ds = disk_free_space("D:");
echo $ds;//481647472640
?>

  下麵來統計在www文件夾下新建的test目錄的個數

<?php
    $dirn = 0; //目錄數
    $filen = 0; //文件數
    //統計一個目錄下的文件和目錄的個數
    function getdirnum($file) {
        global $dirn;
        global $filen;    
        $dir = opendir($file);
        while (false !== ($filename = readdir($dir))) {
            if($filename!="." && $filename !="..") {
                $filename = $file."/".$filename; //更新路徑
                if(is_dir($filename)) {
                    $dirn++;
                    getdirnum($filename);  //遞歸,就可以查看所有子目錄
                } else {
                    $filen++; 
                }
            }
        }
        closedir($dir);
    }
    getdirnum("test");
    echo "目錄數為:{$dirn}<br>";//目錄數為:1
    echo "文件數為:{$filen}<br>";//文件數為:3
?>

  下麵來統計在www文件夾下新建的test目錄的大小

<?php
    //統計目錄大小
    function dirsize($file) {
        $size = 0;
        $dir = opendir($file);
        while(false !== ($filename = readdir($dir))) {
            if($filename!="." && $filename !="..") {
                $filename = $file."/".$filename;
                if(is_dir($filename)) {
                    $size += dirsize($filename);//使用遞歸
                } else {
                    $size += filesize($filename);
                }
            }
        }
        closedir($dir);
        return $size;
    }
echo "test目錄大小為:".dirsize("test")."<br>";//test目錄大小為:302
?>
 

目錄增刪

mkdir()

  mkdir()函數用於新建目錄 

bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )

rmdir()

  rmdir()函數用於刪除目錄

bool rmdir ( string $dirname [, resource $context ] )

  [註意]該目錄必須是空的,而且要有相應的許可權。失敗時會產生一個 E_WARNING 級別的錯誤

unlink()

  unlink()函數用於刪除文件

bool unlink ( string $filename [, resource $context ] )

  下麵來清空test目錄

<?php
    function deldir($dirname) {
        //如果是文件,直接刪除即可
        if(is_file($dirname)) {
            unlink($dirname);
        }
        $dir = opendir($dirname);
        while(FALSE !== ($filename = readdir($dir))) {
            if($filename !="." && $filename!="..") {
                $filename = $dirname."/".$filename;
                if(is_dir($filename)) {
                    deldir($filename);//遞歸
                }else {
                    unlink($filename);//刪除文件
                }
            }
        }
        closedir($dir);
        if($dirname != 'test'){
            rmdir($dirname);//刪除目錄
        }
    }
    deldir("test");
?>

 

目錄複製

copy()

  copy()函數用於拷貝文件 

bool copy ( string $source , string $dest [, resource $context ] )

  [註意]copy()函數不能用於複製目錄

<?php
$file = 'a.txt';
$newfile = 'a.bak';
copy($file, $newfile);
?>

rename()

  rename()函數用於重命名一個文件或目錄

bool rename ( string $oldname , string $newname [, resource $context ] )

  [註意]rename()函數具有移動文件或目錄的功能 

  下麵把www目錄下的test目錄剪貼,命名為t,並移動到d盤目錄下

<?php
rename("test", "d:/t");
?>

  使用rename()只能實現剪切的操作,使用copy()只能複製文件。如果要複製目錄,則需要使用迴圈和遍歷

<?php
    /**
     * $dirsrc  原目錄
     * $dirto  目標目錄
     */
    function copydir($dirsrc, $dirto) {
        //如果目錄不存在,則新建一個目錄
        if(!file_exists($dirto)) {
            mkdir($dirto);
        }
        $dir = opendir($dirsrc);
        while(FALSE !== ($filename = readdir($dir))) {
            if($filename != "." && $filename !="..") {
                $srcfile = $dirsrc."/".$filename;  //原文件
                $tofile = $dirto."/".$filename;    //目標文件
                if(is_dir($srcfile)) {
                    copydir($srcfile, $tofile);  //遞歸處理所有子目錄
                }else{
                    copy($srcfile, $tofile);//複製文件
                }
            }
        }
    }
    copydir("test", "d:/t");
?>

 

文件操作

touch()

  touch()函數用來設定文件的訪問和修改時間。如果文件不存在,則會被創建。成功時返回 TRUE, 或者在失敗時返回 FALSE

bool touch ( string $filename [, int $time = time() [, int $atime ]] )

  參數filename表示要設定的文件名,time表示要設定的時間。如果沒有提供參數 time 則會使用當前系統的時間;atime表示如果給出了這個參數,則給定文件的訪問時間會被設為atime,否則會設置為time。如果沒有給出這兩個參數,則使用當前系統時間

<?php
    touch('abc.txt')
?>

copy()

  copy()函數用於拷貝文件

bool copy ( string $source , string $dest [, resource $context ] )

  [註意]copy()函數不能用於複製目錄

<?php
$file = 'a.txt';
$newfile = 'a.bak';
copy($file, $newfile);
?>

rename()

  rename()函數用於重命名一個文件或目錄

bool rename ( string $oldname , string $newname [, resource $context ] )

  [註意]rename()函數具有移動文件或目錄的功能

<?php
rename("abc.txt", "d:/cba.txt");
?>

unlink()

  unlink()函數用於刪除文件

bool unlink ( string $filename [, resource $context ] )
<?php
unlink("d:/cba.txt");
?>

 

文件內容

fopen()

  fopen()函數用於打開文件或者URL,fopen()將 filename 指定的名字資源綁定到一個流上

  fopen() 中 mode 的可能值列表

mode      說明
'r'       只讀方式打開,將文件指針指向文件頭。
'r+'      讀寫方式打開,將文件指針指向文件頭。
'w'       寫入方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
'w+'      讀寫方式打開,將文件指針指向文件頭並將文件大小截為零。如果文件不存在則嘗試創建之。
'a'       寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
'a+'      讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
<?php
    //使用絕對路徑打開file.txt文件,選擇只讀模式,並返回資源$handle
    $handle = fopen("/home/rasmus/file.txt", "r");

    //訪問文檔根目錄下的文件,也以只讀模式打開
    $handle = fopen(“{$_SERVER['DOCUMENT_ROOT']}/data/info.txt", "r");

    //在 Windows 平臺上,轉義文件路徑中的每個反斜線,或者用斜線,
      以二進位和只寫模式組合
    $handle = fopen("c:\\data\\file.gif", "wb");

    //使用相對路徑打開file.txt文件,選擇只讀模式,並返回資源$handle
    $handle = fopen("../data/info.txt", "r");

    //打開遠程文件, 使用HTTP協議只能以只讀的模式打開
    $handle = fopen("http://www.example.com/", "r");

    //使用FTP協議打開遠程文件,如果FTP伺服器可寫,則可以以寫的模式打開
    $handle = fopen("ftp://user:[email protected]/somefile.txt", "w");
?>

fclose()

  fclose()函數用於關閉一個已打開的文件指針

bool fclose ( resource $handle )
<?php
$handle = fopen('test/a.txt', 'r');
fclose($handle);
?>

fwrite()

  fwrite()函數用於寫入文件(可安全用於二進位文件),返回寫入的字元數,出現錯誤時則返回 FALSE

int fwrite ( resource $handle , string $string [, int $length ] )

  當打開方式為只讀模式時,無法向文件寫入字元

<?php
$fp = fopen('test/a.txt', 'r');
echo fwrite($fp, '1');//0
echo "<br>";
echo fwrite($fp, '23');//0
echo "<br>";
fclose($fp);
?>

  當打開方式為寫模式時,可以向文件寫入字元

<?php
$fp = fopen('test/a.txt', 'w');
echo fwrite($fp, '1');//1
echo "<br>";
echo fwrite($fp, '23');//2
echo "<br>";
fclose($fp);
/*
文件內容為123
 */
?>

  當打開方式為追加模式時,將向文件的尾部追加新的字元

<?php
$fp = fopen('test/a.txt', 'a');
echo fwrite($fp, '1');//1
echo "<br>";
echo fwrite($fp, '23');//2
echo "<br>";
fclose($fp);
/*
刷新兩次時,文件內容為123123
 */
?>

fgetc()

  fgetc()函數用於從文件指針中讀取字元

  [註意]使用fgetc()函數時,需要在fopen()函數中使用讀模式

string fgetc ( resource $handle )
<?php
$fp = fopen('test/a.txt', 'r');
echo fgetc($fp);//1
echo fgetc($fp);//2
echo fgetc($fp);//3
fclose($fp);
?>

feof()

  feof()函數用於測試文件指針是否到了文件結束的位置

bool feof ( resource $handle )
<?php
$fp = fopen('test/a.txt', 'r');
while(!feof($fp)){
    echo fgetc($fp);//123123
}
fclose($fp);
?>

fgets()

  fgets()函數用於從文件指針中讀取一行

string fgets ( resource $handle [, int $length ] )

  將test目錄下的a.txt文件內容修改為

aa
bbb
<?php
$fp = fopen('test/a.txt', 'r');
echo fgets($fp);//'aa'
echo fgets($fp);//'bbb'
echo fgets($fp);//''
fclose($fp);
?>

fread()

  fread()函數用於讀取文件(可安全用於二進位文件)。fread()從文件指針handle讀取最多length個位元組。該函數在讀取了length個位元組或到達了文件末尾(EOF)時將停止讀取文件

string fread ( resource $handle , int $length )
<?php
$fp = fopen('test/a.txt', 'r');
echo fread($fp,3);//'aa '
fclose($fp);

$fp = fopen('test/a.txt', 'r');
echo fread($fp,filesize('test/a.txt'));//'aa bbb'
fclose($fp);
?>

fseek()

  fseek()函數用於在文件指針中定位,成功則返回 0;否則返回

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • dbutils的查詢,主要用到的是query方法,增加,修改和刪除都是update方法,update方法就不講了 只要創建ResultSetHandler介面不同的實現類對象就可以得到想要的查詢結果,該介面的實現類有 接下來講解一些經常用到的: 下麵的代碼都是要拋出異常的,為了看起來簡潔,我在這裡把 ...
  • 》題目要求 》》隨機輸入一個網址 》》截取出該網址的功能變數名稱並顯示 》程式實現 1 package cn.fury.test; 2 3 import java.util.Scanner; 4 5 public class Test{ 6 public static void main(String[] ...
  • 按排序位置的獲取單個欄目的鏈接信息 >>dede>> {dede:autochannel partsort='' typeid=''}{/dede:autochannel} >>dede>> partsort = '0' 欄目所在的排序位置 typeid = '0' 指定的父欄目—>等於0的時候,上... ...
  • 》題目要求: 》》編寫一個收銀櫃臺收款程式。 》》》要求:接收用戶輸入的商品單價、購買數量以及用戶付款的金額 》》》計算並輸出八折以後的商品金額和找零 》程式實現 1 package cn.fury.test; 2 3 import java.util.Scanner; 4 5 public cla ...
  • 1.成員變數的繼承 1.1要點 子類用extends關鍵字繼承父類。子類中可以提供新的方法覆蓋父類中的方法。子類中的方法不能直接訪問父類中的私有域,子類可以用super關鍵字調用父類中的方法。在子類中可以增加域,增加方法或者覆蓋超類的方法,然而絕對不能刪除繼承的任何域和方法。 在一個子類被創建的時候 ...
  • spring squertz是一個強大的定時任務處理方式 1、需要的Jar quartz-1.8.5.jar commons-logging.jar spring-core-3.0.5.RELEASE.jar spring-beans-3.0.5.RELEASE.jar spring-context ...
  • 本文地址 1 程式開發語言綜述 2 iOS開發工程師必備技能 3 運維工程師必備技能 4 前端工程師必備技能 5 大數據工程師必備技能 6 雲計算工程師必備技能 7 安全工程師必備技能 8 移動無線測試工程師必備技能 9 嵌入式開發必備技能 10 微服務架構技能圖譜 11 Hadoop家族技能圖譜 ...
  • 分頁查詢: 首先我們要明確什麼是分頁?為什麼要去分頁? 分頁就是將數據以多頁去展示,使用分頁可以提高客戶的感受。 分頁的分類: 1.物理分頁:只從資料庫中查詢當前頁的數據 優點:不占用很多記憶體 缺點:效率比價低(相比於邏輯分頁) 2.邏輯分頁:從資料庫將所有記錄查詢出來,存儲到記憶體中,展示當前頁,然 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...