【PB案例學習筆記】-04文件瀏覽器

来源:https://www.cnblogs.com/xiezhr/p/18200440
-Advertisement-
Play Games

寫在前面 這是PB案例學習筆記系列文章的第4篇,該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-proje ...


寫在前面

這是PB案例學習筆記系列文章的第4篇,該系列文章適合具有一定PB基礎的讀者。

通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。

文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-project-example.git

gitee代碼倉庫

需要源代碼的小伙伴們可以自行下載查看,後續文章涉及到的案例代碼也都會提交到這個倉庫【pb-project-example

如果對小伙伴有所幫助,希望能給一個小星星⭐支持一下小凡。

一、小目標

學會使用MultiLineEdit控制項以及對文件操作函數的使用,最終實現一個如下圖所示文件瀏覽器功能。

文件瀏覽器

二、創建程式的基本框架

① 建立工作區

② 建立應用

③ 建立視窗

以上步驟忘記的小伙伴,請參照第一篇文章,創建應用、視窗與控制項

④ 建立控制項

在視窗中建立一個SingleLineEdit控制項、一個MultiLineEdit 控制項和CommandButton控制項,各個控制項的名稱

依次為sle_1mle_1cb_1

建立控制項

⑤ 保存視窗

將新建立的視窗保存為w_main

三、設置各個控制項的外觀及屬性

控制項名稱 主要屬性
w_main Title 文件瀏覽器
sle_1 Text (空)
cb_1 TextDefault 打開 | True
mle_1 TextVScrollBar (空)|True

四、編寫代碼

① 在按鈕cb_1 控制項的Clicked事件中添加如下代碼

integer li_filenum,li_loops,li_i
long ll_flen,ll_bytes_read,ll_new_pos
string ls_part,ls_total,ls_filename

ls_filename = sle_1.text

if ls_filename = '' or isnull(ls_filename) then
	messagebox('提示信息','請輸入文件名')
	return
end if

SetPointer(HourGlass!)

ll_flen = FileLength(ls_filename)

if ll_flen<=0 then
	
	messagebox('提示信息','無法打開文件')
	return
end if

li_filenum = FileOpen(ls_filename,StreamMode!,Read!,LockRead!)

if ll_flen >32765 then
	if mod(ll_flen,32765) = 0 then
		li_loops =ll_flen/32765
	else
		li_loops = (ll_flen/32765) +1
	end if
	
else 
	li_loops =1
end if

ll_new_pos =1 

for li_i =1 to li_loops
	ll_bytes_read = FileRead(li_filenum,ls_part)
	ls_total +=ls_part
next 

FileClose(li_filenum)

mle_1.text = ls_total

②在開發界面左邊雙擊App應用對象,在AppOpen 事件中添加如下代碼

open(w_main)

五、運行程式

我們在E:\workspace\2-PB\pbl\pb-project-example\04FileBrowser\dirtest目錄下新建xiezhr.txt 文件

運行程式,然後輸入xiezhr.txt全路徑,點擊【打開】按鈕便可讀出xiezhr.txt文件內容

打開文本內容

六、文件操作函數

2.1 函數列表

函數名稱 描述
CreateDirectory 創建一個目錄
ChangeDirectory 改變當前目錄
DirectoryExists 判斷目錄是否存在
GetCurrentDirectory 獲取當前目錄名
GetFileOpenName 獲取打開文件名
GetFileSaveName 獲取保存文件名
RemoveDirectory 刪除目錄
FileExists 判斷文件是否存在
FileLength 獲取文件長度
FileOpen 打開文件
FileClose 關閉文件
FileDelete 刪除文件
FileCopy 複製文件
FileMove 移動文件
FileSeek 移動文件指針
FileRead 讀取文件
FileWrite 寫文件

2.2 函數詳細說明

2.2.1 CreateDirectory 函數

語法

CreateDirectory (目錄名稱)

參數:

  • 目錄名稱,可以是絕對路徑,如果是絕對路徑,如果是絕對路徑,則在該路徑下創建,否則在項目空間下創建

返回值:Integer

  • 1 函數執行成功
  • -1 函數執行錯誤。例如:目錄已存在,再調用該函數會返回-1

功能

創建目錄

註: 如果目錄存在會報錯,所以在創建目錄前一般會判斷該目錄是否存在,不存在再創建

2.2.2 ChangeDirectory 函數

語法

ChangeDirectory  (目錄名稱)

返回值:Integer

  • 1 函數執行成功
  • -1 函數執行錯誤

功能

改變當前目錄

2.2.3 DirectoryExists 函數

語法

DirectoryExists(目錄名稱)

返回值:boolean

  • 如果目錄存在,則返回true
  • 如果目錄不存在,則返回false
  • 參數不符合規範,則返回false

功能

判斷某個目錄是否存在

2.2.4 GetCurrentDirectory 函數

語法

GetCurrentDirectory ()

返回值:string

  • 當前目錄字元串

功能

獲取當前目錄名

2.2.5 GetFileOpenName 函數

語法

GetFileOpenName(title,pathname,filename{,extension{,filter}})

參數:

  • title:string類型,指定對話框的標題
  • pathname:string類型變數,用於保存該對話框返回的文件路徑及文件名
  • filename:string類型變數,用於保存該對話框返回的文件名
  • extension:string類型,可選項,使用1到3個字元指定預設的擴展文件名
  • filter:string類型,可選項,其值為文件名掩碼,指定顯示在該對話框的列表框中供用戶選擇的文件名滿
    足的條件(比如..TXT,.EXE等)

返回值:Integer

  • 執行成功時返回1
  • 當用戶單擊了對話框上的“Cancel”按鈕時函數返回0
  • 發生錯誤時返回-1
  • 如果任何參數的值為NULL ,返回null

功能

顯示打開文件對話框,讓用戶選擇要打開的文件

例子

li_Value = GetFileOpenName("打開文件", ls_DocName, ls_Named, "rtf", &
"Text Files (*.TXT),*.TXT,"&
+"Doc Files (*.DOC),*.DOC," &
+"rtf files (*.rtf),*.rtf," &
+"all files (*.*),*.*")
If li_Value = -1 Then //打開文件錯誤
	Beep(2) //響鈴兩聲
	MessageBox("提示","文件打開錯誤!",Exclamation!) //提示錯誤
	Return //返回
Elseif li_Value = 0 Then //用戶取消
	Return //直接返回
End If
2.2.6 GetFileSaveName 函數

語法

GetFileSaveName(title,pathname,filename{,extension{,filter}})

參數:

  • title:string類型,指定對話框的標題
  • pathname:string類型變數,用於保存該對話框返回的文件路徑及文件名
  • filename:string類型變數,用於保存該對話框返回的文件名
  • extension:string類型,可選項,使用1到3個字元指定預設的擴展文件名
  • filter:string類型,可選項,其值為文件名掩碼,指定顯示在該對話框的列表框中供用戶選擇的文件名滿
    足的條件(比如..TXT,.EXE等)

返回值:Integer

  • 執行成功時返回1
  • 單擊了對話框上的“Cancel”按鈕時函數返回0
  • 發生錯誤時返回-1
  • 如果任何參數的值為NULL,那麼GetFileSaveName()函數返回NULL

功能

顯示保存文件對話框,讓用戶選擇要保存到的文件。

例子

value = GetFileSaveName("保存文件", docname, named, "txt",&
"Text Files (*.TXT),*.TXT,")
If value <> 1 Then //要保存的文件名沒有正確設定,
    Beep(2)
    MessageBox("錯誤","設置文件名"+docname+"錯誤!")
    return
End If
2.2.7 RemoveDirectory 函數

語法

RemoveDirectory(directoryname)

參數:string

  • directoryname: 要刪除的目錄名

返回值:Integer

  • 1 函數執行成功
  • -1 函數執行錯誤

功能

刪除目錄

2.2.8 FileExists 函數

語法

FileExists ( filename )

參數:string

  • filename:指定要檢查存在性的文件的文件名,其中可以包含路徑

返回值:Boolean

  • 指定文件存在時返回TRUE
  • 指定文件不存在時返回FALSE
  • 執行失敗時,返回FALSE
  • 參數為null,返回null

功能

判斷指定的文件是否存在。

2.2.9 FileLength 函數

語法

FileLength ( filename )

參數:string

  • filename:指定要得到其長度的文件的文件名,其中可以包含路徑

返回值:Long

  • 函數執行成功時返回指定文件的長度(以位元組為單位)。
  • 如果指定的文件不存在,函數返回-1。
  • 參數為null,則返回null
2.2.10 FileOpen 函數

語法

FileOpen(filename{,filemode{,fileaccess{,filelock{,writemode,
{creator,filetype}}}}})
  • filename:string類型,指定要打開文件的名稱,其中可以包含路徑

  • filemode:FileMode枚舉類型,可選項,指定文件打開方式。有效取值為:(LineMode! - 預設值,行
    模式)(StreamMode! - 流模式)

  • fileaccess:FileAccess枚舉類型,可選項,指定文件訪問方式。有效取值為:(Read! - 預設值,只
    讀方式,這樣打開的文件只能進行讀操作;)(Write! - 只寫方式,這樣打開的文件只能進行寫操作)

  • filelock:FileLock枚舉類型,可選項,指定文件加鎖方式。有效取值為:

    • n LockReadWrite! - 預設值,只有打開該文件的用戶能夠訪問該文件,其它用 戶對該文件的訪問均被拒
      絕;

    • n LockRead! - 只有打開該文件的用戶能夠讀該文件,但其它任何用戶均可寫該文件;

    • n LockWrite! - 只有打開該文件的用戶能夠寫該文件,但其它任何用戶均可讀該文件

    • n Shared! - 所有用戶均可讀寫該文件

  • writemode:WriteMode枚舉類型,可選項,當fileaccess參數指定為Write!時,該參數指定在指定文件
    已經存在時數據的添加方式。
    有效取值為:

    • Append! - 預設值,將數據添加到原文件尾部;
    • Replace! - 覆蓋原有數據
    • creator:可選項,用於Macintosh機,使用四個字元的字元串指定文件的創建者。指定該參數後,必須同時
      指定filetype參數
    • filetype:可選項,用於Macintosh機,使用四個字元的字元串指定文件類型

返回值:Integer

  • 執行成功時,返回1
  • 執行失敗時,返回-1
  • 參數為null時,返回null

功能

以指定的讀寫方式打開指定的文件,同時返回該文件的句柄。

2.2.11 FileClose 函數

語法

FileClose ( fileno )

參數:integer

  • fileno:指定要關閉文件的文件句柄,該句柄使用FileOpen()函數打開文件時得到

返回值:Integer

  • 函數執行成功時返回打開文件的句柄 文件操作函數利用該句柄完成對文件的操作
  • 發生錯誤時返回-1
  • 如果fileno參數的值為NULL,那麼FileClose()函數返回NULL

功能

關閉先前用FileOpen()函數打開的文件。

2.2.12 FileDelete 函數

語法

FileDelete ( filename )

參數:string

  • filename:指定要得到其長度的文件的文件名,其中可以包含路徑

返回值:Boolean

  • 函數執行成功時返回TRUE
  • 發生錯誤時返回FALSE
  • 如果filename參數的值為NULL,那麼FileDelete()函數返回NULL。

功能

刪除指定的文件

2.2.13 FileCopy 函數

語法

FileCopy ( Sourcefile, Targetfile{, replace } )

參數:

  • Sourcefile:要複製的文件的名稱的字元串
  • Targetfile: 複製到的文件的名稱的字元串
  • replace :指定是否替換目標文件的布爾值(true),為true時替換目標文件,為false時不替換(預設值為false)

返回值:Integer

  • 執行成功返回1
  • 打開源文件出錯-1
  • 寫入目標文件出錯 -2

註:如果沒有為 源文件 或 目標文件 指定完全限定的路徑,則該函數將相對於當前目錄工作。如果沒有指定replace參數,則FileCopy函數不會替換目標目錄中與在targetfile參數中指定的名稱相同的文件(這相當於將replace值設置為false)。

功能

複製文件

例子

將文件從當前目錄複製到另一個目錄,並將返回值保存在一個變數中

integer li_FileNum
li_FileNum = FileCopy ("jazz.gif" , &
   "C:\emusic\jazz.gif", FALSE)
2.2.14 FileMove 函數

語法

FileMove ( Sourcefile,Targetfile)

參數:

  • Sourcefile:要移動的文件的名稱的字元串
  • Targetfile:要移動文件的位置的名稱的字元串

返回值:

  • 執行成功 1
  • 打開源文件出錯 -1
  • 寫入目標文件出錯 -2

註:如果目標目錄中已經存在同名文件,則無法寫入目標文件。如果要複製目標文件,可以使用FileCopy並將replace參數設置為true。

功能

將當前文件移動到另一目錄

例子

將文件從當前目錄移動到另一個目錄,並將返回值保存在li_FileNum變數中

integer li_FileNum
li_FileNum = FileMove ("xiezhr.csv", &
   "D:/project/xiezhr2024.csv" )
2.2.15 FileSeek函數

語法

FileSeek ( fileno, position, origin )

參數:

  • fileno:integer類型,指定文件句柄(由FileOpen()函數得到)
  • position:long類型,指定相對於origin參數指定位置的新位置偏移量,以位元組為單位
  • originSeekType枚舉類型,指定從哪裡開始移動文件指針,即指針移動的基準。有效取值為:
    • FromBeginning! - 預設值,從文件開頭移動指針;
    • FromCurrent! - 從當前位置移動文件指針;
    • FromEnd! - 從文件結尾處移動文件指針

返回值:Long

  • 函數執行成功時返回指針移動後的指針位置
  • 參數為null,則返回null

功能

將文件指針移動到指定位置。讀寫文件時相應函數會自動移動文件指針。

2.2.16 FileRead 函數

語法

FileRead ( fileno, variable )

參數:

  • fileno:integer類型,指定文件句柄(由FileOpen()函數得到)
  • variable:string或blob類型的變數,用於保存讀取的數據

返回值:Integer

  • 函數執行成功時返回讀取的字元數或位元組數
  • 如果在讀取任何字元前讀到了文件結束符(EOF),則FileRead()函數返回-100
  • 指定文件以行模式打開時,如果在讀取任何字元之前遇到了回車(CR)或換行(LF)字元,則FileRead()
    函數返回0
  • 執行錯誤,函數返回-1

功能

從指定文件中讀取數據

2.2.17 FileWrite 函數

語法

FileWrite (fileno , variable )

參數:

  • fileno:integer類型,指定文件句柄(由FileOpen()函數得到)
  • variable:string或blob類型,其值將寫入fileno參數指定的文件

返回值:Integer

  • 執行成功時返回寫入文件的字元或位元組數
  • 發生錯誤時返回-1
  • 任何參數的值為NULL 函數返回NULL

功能

向指定文件中寫數據。

七、MultiLineEdit 控制項

3.1 常用屬性

屬性 描述
Visible 預設為 True。當為 False 時,該控制項在視窗上隱藏
Enabled 預設為 True。當為 False 時,該控制項不能獲得焦點,用戶不能進行編輯和選
中;控制項背景為灰色
DisplayOnly 預設為 False。當為 True 時,該控制項中的文字不能被修改,並且也不能
輸入,但可以選中、複製
AutoHScroll 預設為 True,表示當用戶輸入的內容顯示不下時,可以自動橫向滾動
游標,但是不顯示滾動條
HideSelection 預設為 True,表示只有當單行編輯器獲得焦點時,才高亮顯示選中文
本。建議使用預設值,因為將該屬性設置為 False,沒有獲得焦點時,選中的內容就高亮顯示,
這容易讓用戶造成錯誤
RightToLeft
Border 是否顯示邊框,預設為 True
Case 有三個選項, upper 表示用戶輸入的內容中的字母都自動轉換成大寫, down
表示都自動轉換成小寫, any 表示不做轉換
Limit 預設是 0,表示沒有長度限制。可以輸入其他一個數字,表示該單行編輯框中
最多接受用戶輸入的字元個數,最大數字是 32 767
HscrollBar 是否顯示橫向滾動條,預設為 False。當該屬性為 True 時,顯示橫向滾
動條, 某行文字的寬度大於控制項的寬度, 則滾動條可用, 否則灰色顯示不可用。 當屬性為 False
時,輸入的文字大於控制項寬度,則自動換行
VscrollBar 是否顯示縱向滾動條,預設為 False。當該屬性為 True 時,顯示縱向滾
動條, 如果文字的高度大於控制項的高度, 則滾動條可用, 否則灰色顯示不可用。 當屬性為 False
時,輸入的文字大於控制項高度時,就不允許再增加新的數據行
AutoVScroll 是否在需要時自動顯示縱向滾動條,預設為 False。如果設置為 True,
在當前內容顯示滿控制項時,增加新的數據行將會出現縱向滾動條
IgnoreDefaultButton 是否忽略 Enter 鍵,預設為 False。如果屬性為 True 並且當前焦
點在多行編輯器中, 這時使用 Enter 鍵則會在多行編輯器中增加一個新行; 如果屬性為 False,
則會觸發視窗上“ Default”按鈕的 Clicked 事件
Alignment 文本的對齊方式,是一個枚舉型取值,有 Center!、 Justify!、 Left!、 Right!4
個取值,預設為 Left!。

3.2 事件和腳本

多行編輯器提供了 12 個預設事件,觸發時機和單行編輯器的 12 個事件完全相同 (忘記的小伙伴可以翻一翻前面文章的內容)經常
使用的事件也是 Modified

多行編輯器也提供了很多的函數,和單行編輯器的同名函數的用法及註意事項完全相同,需要註意的是兩個單行編輯器沒有的函數 LineCountLineLength。這兩個函數經常配合使用,對多行編輯器中的文本逐個字元處理

① LineCount 函數

獲取editname 中數據的實際行數,不管每行後面是否有回車或換行符號

返回值:Integer

  • 執行成功,返回正確行數
  • 執行錯誤返回-1
  • editname 為 Null,則返回 Null

② LineLength 函數

可以獲取 editname 中當前游標所在行,包括空格在內的字元數,

返回值:Integer

  • 正確執行,返回游標所在行字元數
  • 執行錯誤,返回-1
  • 當 editname 為 Null 時返回 Null

本期內容到這兒就結束了,希望對你有所幫助。

我們下期再見 ヾ(•ω•`)o (●'◡'●)

本文來自博客園,作者:xiezhr,轉載請註明原文鏈接:https://www.cnblogs.com/xiezhr/p/18200440


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

-Advertisement-
Play Games
更多相關文章
  • 這篇文章介紹瞭如何在Vue.js應用中利用Vue Router實現單頁面應用的路由管理,包括配置路由、導航守衛的使用、路由懶載入以優化性能以及動態路由的實現方法,旨在提升用戶體驗和應用載入效率 ...
  • Popover API 為開發者提供了一種聲明式的方式來創建各種類型的彈窗。目前已在所有三大瀏覽器引擎中可用,並正式成為 Baseline 2024 的一部分。 ...
  • 前言 眾所周知,vue3的template中使用ref變數無需使用.value。還可以在事件處理器中進行賦值操作時,無需使用.value就可以直接修改ref變數的值,比如:<button @click="msg = 'Hello Vue3'">change msg</button>。你猜vue是在編 ...
  • 政務雲參考技術架構行業優勢總體架構 政務雲平臺技術框架圖,由機房環境、基礎設施層、支撐軟體層及業務應用層組成,在運維、安全和運營體系的保障下,為政務雲使用單位提供統一服務支撐。功能架構標準雙區隔離 參照國家電子政務規範,打造符合標準的雙區隔離的政務雲平臺,互聯網區承載對公服務業務,政務外網區承載各單 ...
  • 介紹: 在當今數字化時代,網路上的信息量龐大,如何使自己的網站在搜索引擎中脫穎而出成為了每個網站管理員都面臨的挑戰。網頁的原創度不僅能提升用戶體驗,還有利於搜索引擎排名。本文將介紹如何利用Coz API來重寫課件PPT網的網頁標題和正文內容,以增加網頁的原創度。 Coz API簡介: Coz是位元組出 ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • Trick: \(x\) 與各位數之和模 \(9\) 同餘(CF10D) st表 和 線段樹 可以存 gcd(CF10D) 註意函數增減性(CF1632D) dp 時若下標太大,可以調換下標和存儲的數值(CF1974E) 貪心不成立時,可以用反悔貪心(CF1974G) 乘法一般比加法更優(CF187 ...
  • 1.概述 1.1 介紹 Qt:它是一套基於C++的跨平臺開發框架,包括GUI、字元串、多線程處理、文件IO、網路IO、3D渲染等 時間:它誕生於1991年,由Haavard Nord和Eirik Chambe-Eng共同締造 發展:歷經Qt Company、Nokia、Digia多個公司開發迭代 版 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...