<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://www.den4b.com/forum/extern.php?action=feed&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[den4b Forum]]></title>
		<link>https://www.den4b.com/forum/index.php</link>
		<description><![CDATA[The most recent topics at den4b Forum.]]></description>
		<lastBuildDate>Sat, 06 Jun 2026 02:11:30 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[Rename Android APK's]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=1598&amp;action=new</link>
			<description><![CDATA[<p>I was investigating how to effectively rename apk collection so I came to this customizable Pascal Script which is able to extract most of apk meta data and fix newline errors in ReNamer files panel using regex function:</p><div class="codebox"><pre class="vscroll"><code>var
  AaptPath, NewNamePattern, Command: WideString;
  AppName, PackageName, VersionName, VersionCode: WideString;
  MinSdkVersion, TargetSdkVersion, CompileSdkVersion: WideString;
  Densities, NativeCode, Locales, ScreenSizes, Permissions: WideString;
  Output: String;
  ExitCode: Cardinal;
  Matches, PermissionLines: TWideStringArray; SinglePermission: WideString;
  DebugMode: Boolean;
  I: Integer;

// Function that maps the SDK number to the requested text format
function GetAndroidVersionName(ApiStr: WideString): WideString;
var
  ApiNum: Integer;
  VerText: WideString;
begin
  if ApiStr = &#039;&#039; then
  begin
    Result := &#039;&#039;;
    Exit;
  end;

  ApiNum := StrToIntDef(ApiStr, 0);
  case ApiNum of
    1: VerText := &#039;Android 1.0&#039;;
    2: VerText := &#039;Android 1.1 (Petit Four)&#039;;
    3: VerText := &#039;Android 1.5 (Cupcake)&#039;;
    4: VerText := &#039;Android 1.6 (Donut)&#039;;
    5: VerText := &#039;Android 2.0 (Eclair)&#039;;
    6: VerText := &#039;Android 2.0.1 (Eclair)&#039;;
    7: VerText := &#039;Android 2.1 (Eclair)&#039;;
    8: VerText := &#039;Android 2.2 (Froyo)&#039;;
    9: VerText := &#039;Android 2.3 (Gingerbread)&#039;;
    10: VerText := &#039;Android 2.3.3 (Gingerbread)&#039;;
    11: VerText := &#039;Android 3.0 (Honeycomb)&#039;;
    12: VerText := &#039;Android 3.1 (Honeycomb)&#039;;
    13: VerText := &#039;Android 3.2 (Honeycomb)&#039;;
    14: VerText := &#039;Android 4.0 (Ice Cream Sandwich)&#039;;
    15: VerText := &#039;Android 4.0.3 (Ice Cream Sandwich)&#039;;
    16: VerText := &#039;Android 4.1 (Jelly Bean)&#039;;
    17: VerText := &#039;Android 4.2 (Jelly Bean)&#039;;
    18: VerText := &#039;Android 4.3 (Jelly Bean)&#039;;
    19: VerText := &#039;Android 4.4 (KitKat)&#039;;
    20: VerText := &#039;Android 4.4W (KitKat Wear)&#039;;
    21: VerText := &#039;Android 5.0 (Lollipop)&#039;;
    22: VerText := &#039;Android 5.1 (Lollipop MR1)&#039;;
    23: VerText := &#039;Android 6.0 (Marshmallow)&#039;;
    24: VerText := &#039;Android 7.0 (Nougat)&#039;;
    25: VerText := &#039;Android 7.1 (Nougat)&#039;;
    26: VerText := &#039;Android 8.0 (Oreo)&#039;;
    27: VerText := &#039;Android 8.1 (Oreo)&#039;;
    28: VerText := &#039;Android 9.0 (Pie)&#039;;
    29: VerText := &#039;Android 10 (Quince Tart)&#039;;
    30: VerText := &#039;Android 11 (Red Velvet Cake)&#039;;
    31: VerText := &#039;Android 12 (Snow Cone)&#039;;
    32: VerText := &#039;Android 12L (Snow Cone v2)&#039;;
    33: VerText := &#039;Android 13 (Tiramisu)&#039;;
    34: VerText := &#039;Android 14 (Upside Down Cake)&#039;;
    35: VerText := &#039;Android 15 (Vanilla Ice Cream)&#039;;
    36: VerText := &#039;Android 16 (Baklava)&#039;;
    37: VerText := &#039;Android 17 (Cinnamon Bun)&#039;;
    else VerText := &#039;Android Unknown&#039;;
  end;

  // Format SDK number
  Result := VerText + &#039; (API &#039; + ApiStr + &#039;)&#039;;
end;

begin
  // ==================== CONFIGURATION ====================
  // 1. Enter the EXACT path to the aapt2.exe tool on your system - download from https://aaptdownload.com/aapt-windows.zip:
  AaptPath := &#039;C:\Users\UserName\Desktop\aapt2.exe&#039;;

  // 2. Declare the pattern for the new file name.
  // Available tags:
  // [NAME], [PACKAGE], [VERSION], [CODE], [PERMISSIONS]
  // [MIN_SDKVERSION], [TARGET_SDKVERSION], [COMPILE_SDKVERSION]
  // [DENSITIES], [NATIVE_CODE], [LOCALES], [SCREEN_SIZES]
  NewNamePattern := &#039;[NAME] [VERSION].[CODE]&#039;;

  // 3. DEBUG MODE: Set to True to see the raw output from aapt2.exe
  // Set to False for normal renaming operation using the pattern above.
  DebugMode := False;
  // =======================================================

  // Execute only if the file extension is APK
  if WideLowerCase(WideExtractFileExt(FileName)) = &#039;.apk&#039; then
  begin
    // Prepare the command line for ExecConsoleApp to extract badging metadata
    Command := &#039;&quot;&#039; + AaptPath + &#039;&quot; dump badging &quot;&#039; + FilePath + &#039;&quot;&#039;;

    // Execute the console application and capture its standard output
    ExitCode := ExecConsoleApp(Command, Output);

    // If the tool executed successfully and returned data
    if (ExitCode = 0) and (Output &lt;&gt; &#039;&#039;) then
    begin
      // If DebugMode is enabled, bypass renaming and output the raw text
      if DebugMode then
      begin
        FileName := Output + &#039;.apk&#039;;
        Exit;
      end;

      // --- 1. CORE METADATA EXTRACTION ---

      // Isolate the Package Name
      Matches := SubMatchesRegEx(Output, &#039;package: name=&#039;&#039;([^&#039;&#039;]*)&#039;&#039;&#039;, False);
      if Length(Matches) &gt; 0 then PackageName := Matches[0];

      // Isolate the Version Code
      Matches := SubMatchesRegEx(Output, &#039;versionCode=&#039;&#039;([^&#039;&#039;]*)&#039;&#039;&#039;, False);
      if Length(Matches) &gt; 0 then VersionCode := Matches[0];

      // Isolate the Version Name
      Matches := SubMatchesRegEx(Output, &#039;versionName=&#039;&#039;([^&#039;&#039;]*)&#039;&#039;&#039;, False);
      if Length(Matches) &gt; 0 then VersionName := Matches[0];

      // Isolate the Compile SDK Version
      Matches := SubMatchesRegEx(Output, &#039;compileSdkVersion=&#039;&#039;([^&#039;&#039;]*)&#039;&#039;&#039;, False);
      if Length(Matches) &gt; 0 then CompileSdkVersion := Matches[0];

      // Isolate the Minimum SDK Version
      Matches := SubMatchesRegEx(Output, &#039;sdkVersion:&#039;&#039;([^&#039;&#039;]*)&#039;&#039;&#039;, False);
      if Length(Matches) &gt; 0 then MinSdkVersion := Matches[0];

      // Isolate the Target SDK Version
      Matches := SubMatchesRegEx(Output, &#039;targetSdkVersion:&#039;&#039;([^&#039;&#039;]*)&#039;&#039;&#039;, False);
      if Length(Matches) &gt; 0 then TargetSdkVersion := Matches[0];

      // Pass extracted values through the version mapping function
      MinSdkVersion := GetAndroidVersionName(MinSdkVersion);
      TargetSdkVersion := GetAndroidVersionName(TargetSdkVersion);
      CompileSdkVersion := GetAndroidVersionName(CompileSdkVersion);

      // --- 2. LIST METADATA EXTRACTION ---
      Matches := SubMatchesRegEx(Output, &#039;densities:\s*([^\r]*)&#039;, False);
      if Length(Matches) &gt; 0 then
      begin
        Densities := WideReplaceStr(Matches[0], &#039;&#039;&#039; &#039;&#039;&#039;, &#039;, &#039;);
        Densities := WideReplaceStr(Densities, &#039;&#039;&#039;&#039;, &#039;&#039;);
      end;

      Matches := SubMatchesRegEx(Output, &#039;native-code:\s*([^\r]*)&#039;, False);
      if Length(Matches) &gt; 0 then
      begin
        NativeCode := WideReplaceStr(Matches[0], &#039;&#039;&#039; &#039;&#039;&#039;, &#039;, &#039;);
        NativeCode := WideReplaceStr(NativeCode, &#039;&#039;&#039;&#039;, &#039;&#039;);
      end;

      Matches := SubMatchesRegEx(Output, &#039;locales:\s*([^\r]*)&#039;, False);
      if Length(Matches) &gt; 0 then
      begin
        Locales := WideReplaceStr(Matches[0], &#039;&#039;&#039; &#039;&#039;&#039;, &#039;, &#039;);
        Locales := WideReplaceStr(Locales, &#039;&#039;&#039;&#039;, &#039;&#039;);
      end;

      Matches := SubMatchesRegEx(Output, &#039;supports-screens:\s*([^\r]*)&#039;, False);
      if Length(Matches) &gt; 0 then
      begin
        ScreenSizes := WideReplaceStr(Matches[0], &#039;&#039;&#039; &#039;&#039;&#039;, &#039;, &#039;);
        ScreenSizes := WideReplaceStr(ScreenSizes, &#039;&#039;&#039;&#039;, &#039;&#039;);
      end;

      // --- 3. GLOBAL PERMISSIONS EXTRACTION ---
      PermissionLines := MatchesRegEx(Output, &#039;uses-permission: name=&#039;&#039;[^&#039;&#039;]+&#039;&#039;&#039;, False);
      if Length(PermissionLines) &gt; 0 then
      begin
        Permissions := &#039;&#039;;
        for I := 0 to Length(PermissionLines) - 1 do
        begin
          SinglePermission := ReplaceRegEx(PermissionLines[I], &#039;uses-permission: name=&#039;&#039;([^&#039;&#039;]+)&#039;&#039;&#039;, &#039;$1&#039;, False, True);

          if SinglePermission &lt;&gt; &#039;&#039; then
          begin
            if Permissions &lt;&gt; &#039;&#039; then Permissions := Permissions + &#039;, &#039;;
            Permissions := Permissions + SinglePermission;
          end;
        end;
      end;

      // --- 4. APPLICATION NAME EXTRACTION ---
      Matches := SubMatchesRegEx(Output, &#039;\bapplication-label:&#039;&#039;([^&#039;&#039;]*)&#039;&#039;&#039;, False);
      if Length(Matches) &gt; 0 then AppName := Matches[0];

      if AppName = &#039;&#039; then
      begin
        Matches := SubMatchesRegEx(Output, &#039;\bapplication: label=&#039;&#039;([^&#039;&#039;]*)&#039;&#039;&#039;, False);
        if Length(Matches) &gt; 0 then AppName := Matches[0];
      end;

      if AppName = &#039;&#039; then AppName := PackageName;

      // --- 5. PATTERN REPLACEMENT ---
      if (AppName &lt;&gt; &#039;&#039;) or (PackageName &lt;&gt; &#039;&#039;) then
      begin
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[NAME]&#039;, AppName);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[PACKAGE]&#039;, PackageName);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[VERSION]&#039;, VersionName);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[CODE]&#039;, VersionCode);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[MIN_SDKVERSION]&#039;, MinSdkVersion);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[TARGET_SDKVERSION]&#039;, TargetSdkVersion);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[COMPILE_SDKVERSION]&#039;, CompileSdkVersion);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[DENSITIES]&#039;, Densities);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[NATIVE_CODE]&#039;, NativeCode);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[LOCALES]&#039;, Locales);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[SCREEN_SIZES]&#039;, ScreenSizes);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;[PERMISSIONS]&#039;, Permissions);

        // Sanitize the filename by replacing or removing illegal OS characters (\ / : * ? &quot; &lt; &gt; |)
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;/&#039;, &#039;-&#039;);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;\&#039;, &#039;-&#039;);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;:&#039;, &#039;-&#039;);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;*&#039;, &#039;&#039;);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;?&#039;, &#039;&#039;);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;&quot;&#039;, &#039;&#039;);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;&lt;&#039;, &#039;&#039;);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;&gt;&#039;, &#039;&#039;);
        NewNamePattern := WideReplaceStr(NewNamePattern, &#039;|&#039;, &#039;&#039;);

        // Assign the final formatted name with the extension
        FileName := NewNamePattern + &#039;.apk&#039;;
      end;
    end;
  end;
end.</code></pre></div><br /><p><strong>Requirements:</strong></p><p>To use this script, you must point AaptPath to a valid aapt2.exe file. You can download a standalone Windows build directly from this mirror link: <a href="https://aaptdownload.com/aapt-windows.zip" rel="nofollow">aapt-windows.zip</a>.</p><p><strong>Script Analysis &amp; Key Features:</strong></p><ul><li><p><strong>GetAndroidVersionName function</strong>: It contains a lookup list of all Android versions and their official codenames. It automatically translates API level numbers (like 23) into clean, human-readable tags like &quot;Android 6.0 (Marshmallow) (API 23)&quot;.</p></li></ul><ul><li><p><strong>CONFIGURATION</strong>: You can define path of aapt2.exe file (Android Asset Packaging Tool) and NewNamePattern using tags: <strong>NAME, PACKAGE, VERSION, CODE, PERMISSIONS, MIN_SDKVERSION, TARGET_SDKVERSION, COMPILE_SDKVERSION, DENSITIES, NATIVE_CODE, LOCALES, SCREEN_SIZES</strong>. This is an example pattern: &#039;<strong>[NAME] [VERSION] [PACKAGE]</strong>&#039;</p></li></ul><ul><li><p><strong>The Newline Fix (Using [^\r]* RegEx)</strong>: Fetching multi-value metadata like densities, native-code, or supports-screens caused severe formatting bugs. The raw console output from aapt2 ends these lines with carriage returns. ReNamer&#039;s files panel interpreted those raw line breaks literally, corrupting the filename grid visualization. By switching the pattern to ([^\r]*), the script explicitly halts extraction right before the carriage return, completely resolving the visual newline glitch.</p></li></ul><ul><li><p><strong>Global Permission Aggregation</strong>: Instead of grabbing just the first encountered permission, MatchesRegEx(Output, &#039;uses-permission: name=&#039;&#039;[^&#039;&#039;]+&#039;&#039;&#039;, False) loops globally through the entire dump. It collects all permissions, strips the boilerplate syntax via ReplaceRegEx, and merges them into a comma-separated single line tag [PERMISSIONS].</p></li></ul><ul><li><p><strong>Filename Sanitization</strong>: At the very end, the script acts as a safety net by explicitly swapping or deleting illegal OS filesystem characters (\ / : * ? &quot; &lt; &gt; |), ensuring Windows doesn&#039;t reject the final output string.</p></li></ul><p><strong>Note</strong>: Adding larger list/size apks to ReNamer will take some time to process. Test the output with few smaller apks before deciding to add all of them.</p><p>Hopefully, this script helps anyone managing large offline Android application archives! If you have any suggestions or optimizations feel free to share!</p><p>P.S. Денис, using 3rd party tool within Pascal sript rule seems to cause Analyze dialog to ignore New name string in Text after applying rules box. I checked some other Pascal script examples and they work fine. If this is an issue, let me know to open separate topic if required.</p>]]></description>
			<author><![CDATA[dummy@example.com (eR@SeR)]]></author>
			<pubDate>Sat, 06 Jun 2026 02:11:30 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=1598&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Suggestion| to set position or selection before applying action (rule)]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=2327&amp;action=new</link>
			<description><![CDATA[<p>I think that in your program it would be a Macro.<br />See how in Microsoft Word macros recording works.<br />In the same way, when the user is asked &quot;where:&quot;,<br />when he choose a Macro option,<br />a dialog box is opened, something like a TextBox with all the filenames list, and a Record icon is flashing.<br />It will record the user keys (movements/selections) the same way user uses in Word or Notepad.<br />For Example:<br />End, Ctrl+LeftArrow, Ctrl+Shift+LeftArrow</p><p>When the user use DownArrow/UpArrow to move to next/prev filename,<br />the cursor jumps to the beginning of the line/filename and the recording start over.</p><p>When user move/select in one line, he will be able to see how it takes effect in other lines.<br />That means, in each line there is a cursor/selection,<br />so that the user&#039;s line is in one color, and the other lines are in different color.</p>]]></description>
			<author><![CDATA[dummy@example.com (Stamimail)]]></author>
			<pubDate>Wed, 03 Jun 2026 13:04:06 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=2327&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Bug: Leap year handling]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3119&amp;action=new</link>
			<description><![CDATA[<p>Unable to reproduce it with ReNamer 7.9 and 7.9.0.3 Beta.</p><p>Reformatting 29-02-2024 from &quot;dd-mm-yyyy&quot; to &quot;yyyy-mm-dd&quot; works as expected.</p><p>If you are still experiencing this issue, please provide steps to reproduce it with the latest version.</p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Tue, 02 Jun 2026 17:40:16 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3119&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Shutter not working on HP ProDesk 600 G5 mini PCs]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3118&amp;action=new</link>
			<description><![CDATA[<p>Hello.</p><p>There is no compatibility issue with the hardware, as Shutter does not interact directly with the hardware for the reboot action, it is a purely an OS call.</p><p>The problem is most likely caused by some other application or service which prevents the computer from shutting down. This is a common issue. To counteract it, you can enable &quot;<strong>Force applications to close upon reboot</strong>&quot; option in the action configuration.</p><p>Alternatively, you may be able to find which application/service prevents the reboot by inspecting power related events in the Windows Event Viewer, but this may get quite technical.</p><p>For reference, see <a href="https://www.den4b.com/docs/books/shutter/page/frequently-asked-questions#bkmrk-shutdown-or-reboot-a" rel="nofollow">Shutdown or reboot action has no effect</a> section in FAQ.</p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Mon, 01 Jun 2026 19:32:25 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3118&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Presets Manager improvements]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3117&amp;action=new</link>
			<description><![CDATA[<p>Thank you!!</p>]]></description>
			<author><![CDATA[dummy@example.com (sdaughtry)]]></author>
			<pubDate>Sat, 23 May 2026 17:11:14 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3117&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Move trailing year in folders]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3116&amp;action=new</link>
			<description><![CDATA[<p>Thank you very much. I don&#039;t understand any of this, but I managed to do it using regular expressions.</p><p>Have a nice weekend!</p>]]></description>
			<author><![CDATA[dummy@example.com (Yetiisyou)]]></author>
			<pubDate>Sun, 03 May 2026 14:08:30 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3116&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Dark mode in ReNamer - So important for eye comfort]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3114&amp;action=new</link>
			<description><![CDATA[<p>Acknowledged and planned.</p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Sat, 25 Apr 2026 13:53:26 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3114&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Mapping rule doesn't work with accented characters (a → à, c → ç, etc)]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3115&amp;action=new</link>
			<description><![CDATA[<p>The <strong>skip extension</strong> option needs to be unticked, when your match includes the file extension <img src="https://www.den4b.com/forum/img/smilies/wink.png" width="15" height="15" alt="wink" /></p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Sat, 25 Apr 2026 13:44:36 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3115&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Analyze dialog - line ending with only a carriage return]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3112&amp;action=new</link>
			<description><![CDATA[<div class="quotebox"><cite>den4b wrote:</cite><blockquote><div><p>This issue has been resolved in v7.9.0.1 Beta.</p></div></blockquote></div><p>Confirmed. Carriage return (#13) remains at line ending without exception. Thank you.</p>]]></description>
			<author><![CDATA[dummy@example.com (eR@SeR)]]></author>
			<pubDate>Sat, 18 Apr 2026 21:52:06 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3112&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Adding a folder via shell extension also adds System32 folder]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3111&amp;action=new</link>
			<description><![CDATA[<p>This issue has been resolved in <strong>v7.9.0.1 Beta</strong>.</p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Sat, 18 Apr 2026 21:41:07 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3111&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Rename a file after another file]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3113&amp;action=new</link>
			<description><![CDATA[<p>You&#039;ll need to use the <a href="https://www.den4b.com/docs/books/renamer/page/pascal-script-rule" rel="nofollow">Pascal Script rule</a> for this.</p><p>This script will find the first file matching the specified mask (<em>MASTER_FILE_MASK</em>) located in the same directory, and will use its base name as the new name for the file in the renaming list.</p><div class="codebox"><pre><code>const
  MASTER_FILE_MASK = &#039;*.src&#039;;

function FindFirstFile(const Folder, FileMask: WideString): WideString;
var
  Files: TWideStringArray;
begin
  Result := &#039;&#039;;
  SetLength(Files, 0);
  WideScanDirForFiles(Folder, Files, False, False, False, FileMask);
  if Length(Files) &gt; 0 then
    Result := Files[0];
end;

var
  MasterFile: WideString;

begin
  MasterFile := FindFirstFile(WideExtractFileDir(FilePath), MASTER_FILE_MASK);
  if Length(MasterFile) &gt; 0 then
    FileName := WideExtractBaseName(MasterFile) + WideExtractFileExt(FilePath);
end.</code></pre></div><p>P.S. This script now has a permanent place in the <a href="https://www.den4b.com/docs/books/renamer/page/pascal-script-library#bkmrk-renaming-files-to-ma" rel="nofollow">Pascal Script Library</a>.</p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Sat, 18 Apr 2026 15:24:06 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3113&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Long Path Solution?]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=2838&amp;action=new</link>
			<description><![CDATA[<p><a href="https://www.den4b.com/news/3110/renamer-7-9" rel="nofollow">ReNamer 7.9</a> supports <a href="https://www.den4b.com/docs/books/renamer/page/long-paths" rel="nofollow">Long Paths</a>.</p><p>ReNamer now declares itself as Long Path Aware in its application manifest, and on systems with native long path support enabled, it will handle paths beyond the legacy 260-character Windows limit automatically with no additional configuration.</p><p>For systems without native long path support, a new &quot;<em>Convert paths to long path specification</em>&quot; option in the settings offers an alternative, automatically prefixing added paths with a special prefix to raise the effective limit to 32,767 characters.</p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Thu, 02 Apr 2026 13:08:28 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=2838&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Feature request: Support for long filenames/folder names/long paths]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=2454&amp;action=new</link>
			<description><![CDATA[<p><a href="https://www.den4b.com/news/3110/renamer-7-9" rel="nofollow">ReNamer 7.9</a> supports <a href="https://www.den4b.com/docs/books/renamer/page/long-paths" rel="nofollow">Long Paths</a>.</p><p>ReNamer now declares itself as Long Path Aware in its application manifest, and on systems with native long path support enabled, it will handle paths beyond the legacy 260-character Windows limit automatically with no additional configuration.</p><p>For systems without native long path support, a new &quot;<em>Convert paths to long path specification</em>&quot; option in the settings offers an alternative, automatically prefixing added paths with a special prefix to raise the effective limit to 32,767 characters.</p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Thu, 02 Apr 2026 13:08:09 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=2454&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[RENAMER Compatibility (Linux)]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=2508&amp;action=new</link>
			<description><![CDATA[<div class="quotebox"><cite>spiritual2700 wrote:</cite><blockquote><div><p>I&#039;ve been running ReNamer for over a year with Wine v10, and v11 on Kubuntu. No issues. Would like to see a native Linux build someday though. Great app.</p></div></blockquote></div><p>Thank you your feedback. It&#039;s great to know.</p><p>There is quite a bit functionality that is OS dependent and requires rewriting, but we should have the first beta version for Linux later this year.</p>]]></description>
			<author><![CDATA[dummy@example.com (den4b)]]></author>
			<pubDate>Tue, 17 Mar 2026 19:00:10 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=2508&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Renaming ebook files]]></title>
			<link>https://www.den4b.com/forum/viewtopic.php?id=3109&amp;action=new</link>
			<description><![CDATA[<p>The renaming is now perfect. If anyone wants to discuss books, or authors, or see my list, click the email button to continue a conversation not directly related to their naming. I am grateful for the help I received here.</p>]]></description>
			<author><![CDATA[dummy@example.com (Digidoc)]]></author>
			<pubDate>Fri, 13 Mar 2026 22:17:00 +0000</pubDate>
			<guid>https://www.den4b.com/forum/viewtopic.php?id=3109&amp;action=new</guid>
		</item>
	</channel>
</rss>
