delphi 由绝对路径获得相对路径算法

  // 取两个目录的相对路径,注意串尾不能是'/'字符!

 

function GetRelativePath(Source, Dest: string): string;

  //交换字串

 

    function GetPathComp(s1, s2: string): integer;

        procedure swapStr(var s1, s2: string);

        var tempstr: string;

        begin

            tempstr := s1;

            s1 := s2;

            s2 := tempstr;

        end;

    //比较两路径字符串头部相同串的函数

    begin

        if length(s1) > Length(s2) then swapStr(s1, s2);

 

        Result := pos(s1, s2);

        while Result = 0 do

        begin

            if s1 = '' then exit;

            s1 := ExtractFileDir(s1);

            Result := pos(s1, s2);

        end;

 

        if Result <> 0 then Result := Length(s1);

        if Result = 3 then Result := 2;

      //修正因ExtractFileDir()处理'c:/'时产生的错误.

    end;

 

    function GetRoot(s: ShortString): string;

    //取Dest的相对根路径的函数

    var i: integer;

    begin

        Result := '';

        for i := 1 to Length(s) do

            if s[i] = '/' then Result := Result + '../';

        if Result = '' then Result := './';

      //如果不想处理成"./"的路径格式,可去掉本行

    end;

        function RightSub(s: string; Len: Integer): string;

    begin

        Delete(s, 1, Length(s) - Len);

        Result := s;

    end;

 

var

    RelativRoot, RelativSub: string;

    HeadNum: integer;

  //取右子串

 

 

begin

    Source := UpperCase(Source); Dest := UpperCase(Dest);

  //比较两路径字符串头部相同串

    HeadNum := GetPathComp(Source, Dest);

  //取Dest的相对根路径

    RelativRoot := GetRoot(RightSub(Dest, Length(Dest) - HeadNum));

  //取Source的相对子路径

    RelativSub := RightSub(Source, Length(Source) - HeadNum - 1);

 

  //返回

    Result := RelativRoot + RelativSub;

end;

//by 闫磊 Email:Landgis@126.com,yanleigis@21cn.com 2001.11.23

调用

 

procedure TForm1.Button1Click(Sender: TObject);

begin

    showmessage(GetRelativePath('c:/test/aim', 'c:/test'));

end;

 

 

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi中实现AES加密算法可以使用一些第三方库来简化操作。以下是一个示例代码,使用DelphiCryptlib库来实现AES加密算法: 1. 首先,下载并安装DelphiCryptlib库,可以从官方网站(https://www.cryptlib.com/)上找到下载链接。 2. 在Delphi中创建一个新的工程,并导入DelphiCryptlib库的单元文件。确保路径设置正确,以便让Delphi找到库文件。 3. 使用以下代码示例来实现AES加密和解密的函数: ```delphi uses Cryptlib; function AESEncrypt(const PlainText, Key: AnsiString): AnsiString; var CipherText: AnsiString; keyData: CRYPT_KEYDATA; keyID: CRYPT_KEYID; begin SetLength(CipherText, Length(PlainText) + 16); // 假设加密后的密文长度不会超过原文长度+16 cryptInit; cryptAddRandom(nil, CRYPT_RANDOM_SLOWPOLL); cryptCreateContext(@keyID, CRYPT_UNUSED, CRYPT_ALGO_AES); cryptSetAttribute(keyID, CRYPT_CTXINFO_MODE, CRYPT_MODE_CBC); cryptSetAttribute(keyID, CRYPT_CTXINFO_KEYSIZE, 128); // 使用128位的AES加密算法 keyData.keySize := Length(Key); keyData.keyMaterial := PAnsiChar(Key); cryptSetAttributeString(keyID, CRYPT_CTXINFO_KEY, @keyData.keyMaterial, keyData.keySize); cryptEncrypt(keyID, PAnsiChar(PlainText), Length(PlainText), PAnsiChar(CipherText), Length(CipherText)); cryptDestroyContext(keyID); cryptEnd; Result := Copy(CipherText, 0, Length(PlainText)); end; function AESDecrypt(const CipherText, Key: AnsiString): AnsiString;var PlainText: AnsiString; keyData: CRYPT_KEYDATA; keyID: CRYPT_KEYID; begin SetLength(PlainText, Length(CipherText)); cryptInit; cryptAddRandom(nil, CRYPT_RANDOM_SLOWPOLL); cryptCreateContext(@keyID, CRYPT_UNUSED, CRYPT_ALGO_AES); cryptSetAttribute(keyID, CRYPT_CTXINFO_MODE, CRYPT_MODE_CBC); cryptSetAttribute(keyID, CRYPT_CTXINFO_KEYSIZE, 128); // 使用128位的AES加密算法 keyData.keySize := Length(Key); keyData.keyMaterial := PAnsiChar(Key); cryptSetAttributeString(keyID, CRYPT_CTXINFO_KEY, @keyData.keyMaterial, keyData.keySize); cryptDecrypt(keyID, PAnsiChar(CipherText), Length(CipherText), PAnsiChar(PlainText), Length(PlainText)); cryptDestroyContext(keyID); cryptEnd; Result := PlainText; end; ``` 以上代码使用了Cryptlib库的函数来实现AES加密和解密。请注意,这只是一个简单的示例,如果需要更高级的用法,可以参考Cryptlib库的文档或其他AES加密算法的实现。 希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值